Die Uhr wird ein Gegenstand -- Rot x Babyblau, und start.css wird geteilt
DIE UHR. Filipe: "viel viel viel viel viel viel viel spezieller ... eine
mischung von rot und babyblau". Was eine Uhr teuer aussehen laesst, ist
nicht die Farbe, sondern das GEHAEUSE -- bei einer echten sieht man drei
Schichten uebereinander: einen Metallrand, der das Licht von oben faengt,
eine VERTIEFTE Scheibe darin, und ein Glas darueber, das spiegelt. Genau
die drei sind jetzt gebaut.
Die beiden Farben sind nicht aus dem Farbkasten: Rot ist Spicy Media,
Babyblau ist DogFather -- dieselben zwei, die im Kopf der Anmeldekarte
nebeneinanderstehen und im Motiv den Neonrahmen bilden. Zwei Verlaeufe,
absichtlich GEGENLAEUFIG (Stundenring rot->blau, Sekundenring blau->rot):
Wo der eine warm ist, ist der andere kuehl, so bleiben sie
auseinanderzuhalten, wo sie sich ueberlagern.
Dazu: eine Skala aus sechzig Strichen, jeder fuenfte kraeftiger (aus
einem Kegelverlauf, nicht aus sechzig Elementen); ein leuchtender Kopf,
der am Ende des Sekundenbogens mitlaeuft -- die einzige Stelle, an der
sich sichtbar etwas bewegt; und die Mischung IM Text als zwei Schatten
statt als Verlaufsschrift (background-clip: text waere im Windows-
Kontrastmodus unsichtbar). Die Glocke bekommt dasselbe Gehaeuse, nur
kleiner -- zwei runde Dinge aus verschiedenem Material sehen
zusammengesucht aus.
PROFILBILDER: /api/personen lieferte nur id, name, rolle. Deshalb konnte
KEINE Oberflaeche ein Gesicht zeigen, auch wenn eines hochgeladen war --
der Fehler lag nicht in der Anzeige, sondern in der Schnittstelle.
Jetzt kommt die fertige Bildadresse mit (nicht der Dateiname: sonst
setzt jede Stelle im Browser denselben Pfad zusammen). Und DogFather ist
fuer alle sichtbar -- Name, Rolle, Bild, sonst nichts; seine Eintraege,
Chats und Zahlen haengen weiter an den eigenen Regeln der Module.
start.css GETEILT statt gekuerzt. Sie lief mit 202 KB wieder in die
200-KB-Grenze, und diesmal war Kuerzen die falsche Antwort: Dreizehn
Seiten laden diese Datei, Uhr und Begruessungskachel braucht genau EINE.
Also heim.css -- 184 KB statt 202, und zwoelf Seiten laden 14 KB
weniger. Vorher mit grep nachgesehen, dass `uhr`, `willkommen` und
`glocke-platz` in keiner anderen HTML-Datei vorkommen.
ZWEI FUNDE DER PRUEFUNGEN, beide berechtigt:
- `.glocke--kachel` musste zurueck nach start.css. glocke.js laeuft auf
ALLEN siebzehn Seiten und kann die Klasse ueberall setzen; die Regel
gehoert dorthin, wo das Skript sie brauchen KANN, nicht dorthin, wo
es sie heute zufaellig braucht.
- Die Sekundenanzeige stand auf 10,88 px (Grenze 11,5). Gesperrte
Ziffern in Versalhoehe wirken kleiner als die Zahl sagt -- auf
11,84 px.
Gruen: css-klassen (15), struktur (32), sicht (48), buehne (38),
start-ansicht (136), handy (59), aufgabenbrett (44).
NOCH OFFEN aus derselben Nachricht: die Calls-Seite komplett umbauen mit
Auf-/Zuklappen ueberall, die Profilbilder auch WIRKLICH ueberall
zeichnen (die Daten sind jetzt da), die Rolle "Spicy Media" und
Manager-legt-Creator-an.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+71
-252
@@ -4205,261 +4205,20 @@ body[data-fremde-sicht="ja"]::after {
|
||||
.kachel__zeichen::after { display: none; }
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE BEGRÜSSUNGSKACHEL — mit Uhr und Glocke (07.09.2026)
|
||||
/* Die Begrüßungskachel mit Uhr und Glocke steht seit dem 07.09.2026 in
|
||||
einer EIGENEN Datei: assets/css/heim.css.
|
||||
|
||||
Wunsch Filipe: "ich will dass diese kacheln da auch übertrieben geil
|
||||
gemacht wird, wirklich seeeeeehr hochwertig mit einer runden
|
||||
digitalen uhr rechts in der kachel ... und der benachrichtigungs
|
||||
button soll auch von der leiste in diese kachel gesetzt werden."
|
||||
Grund war eine Grenze, die zu Recht anschlug: start.css lief über
|
||||
200 KB (pruef-struktur). Die Datei wird von DREIZEHN Seiten geladen --
|
||||
Uhr, Zifferblatt, Glockenmulde und Begrüßungskachel braucht aber
|
||||
genau EINE. Zwölf Seiten haben also Regeln heruntergeladen, die sie
|
||||
nie anwenden.
|
||||
|
||||
---------------------------------------------------------------------
|
||||
WARUM DIE UHR HIER RICHTIG IST UND NICHT NUR SCHÖN
|
||||
Aufteilen war deshalb die richtige Antwort und nicht Kürzen: Es macht
|
||||
start.css kleiner UND spart den anderen Seiten Bytes. Gemessen mit
|
||||
grep, bevor es verschoben wurde: `class="uhr"`, `willkommen` und
|
||||
`glocke-platz` kommen in keiner anderen HTML-Datei vor. */
|
||||
|
||||
Eine Uhr ist die einzige Angabe auf dieser Seite, die sich ändert,
|
||||
während man hinsieht. Genau das macht sie wertvoll: Sie sagt ohne ein
|
||||
Wort, dass die Seite LEBT -- dass die Zahlen daneben von jetzt sind
|
||||
und nicht von gestern Nacht. Eine Oberfläche, bei der man das nicht
|
||||
weiß, prüft man ständig nach.
|
||||
|
||||
Und sie steht neben dem Datum, das ohnehin dort steht. Zwei Angaben
|
||||
zur selben Frage gehören zusammen; das Datum oben und die Uhrzeit in
|
||||
der Fußzeile wären zwei halbe Antworten.
|
||||
|
||||
---------------------------------------------------------------------
|
||||
ZWEI RINGE, NICHT EINER
|
||||
|
||||
Der innere Ring füllt sich in einer Minute, der äußere in einer
|
||||
Stunde. Das ist der Unterschied zwischen "eine Uhr, die tickt" und
|
||||
"eine Uhr, an der man den Stand der Stunde sieht" -- man erkennt aus
|
||||
dem Augenwinkel, ob die Stunde jung ist oder gleich vorbei.
|
||||
|
||||
Der Sekundenring läuft NICHT weich. Ein weicher Zeiger sieht teurer
|
||||
aus, kostet aber eine Bildberechnung pro Bild statt einer pro
|
||||
Sekunde, und auf einer Seite, die stundenlang offen steht, ist das
|
||||
der Unterschied zwischen einem warmen und einem kalten Rechner.
|
||||
Der Sprung ist außerdem ehrlicher: Die Anzeige ist digital.
|
||||
===================================================================== */
|
||||
|
||||
/* Die Kachel selbst: dasselbe Material wie die Bereichskacheln, damit
|
||||
nicht zwei Oberflächen nebeneinanderliegen. Sie hat KEINE eigene
|
||||
Farbschiene -- sie gehört zu keiner Kategorie, sie ist der Anfang. */
|
||||
.willkommen {
|
||||
position: relative;
|
||||
padding: 22px 24px;
|
||||
border: 1px solid var(--rand);
|
||||
border-radius: 4px 20px 20px 4px;
|
||||
background:
|
||||
linear-gradient(90deg,
|
||||
rgba(63, 189, 245, .10) 0%,
|
||||
rgba(63, 189, 245, .03) 14%,
|
||||
transparent 40%),
|
||||
linear-gradient(163deg,
|
||||
rgba(23, 31, 45, .95) 0%,
|
||||
rgba(11, 15, 24, .95) 58%,
|
||||
rgba(8, 11, 18, .95) 100%);
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, .10),
|
||||
inset 0 -1px 0 rgba(0, 0, 0, .50),
|
||||
inset 2px 0 0 -1px color-mix(in srgb, var(--akzent) 34%, transparent),
|
||||
0 2px 5px -2px rgba(0, 0, 0, .55),
|
||||
0 16px 34px -20px rgba(0, 0, 0, .88);
|
||||
overflow: hidden;
|
||||
}
|
||||
/* Die Leuchtschiene links -- dieselbe Sprache wie überall, hier im
|
||||
Hausakzent statt in einer Kategoriefarbe. */
|
||||
.willkommen::before {
|
||||
content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
|
||||
border-radius: 4px 0 0 4px;
|
||||
background: linear-gradient(180deg,
|
||||
color-mix(in srgb, var(--akzent) 55%, #fff) 0%,
|
||||
var(--akzent) 26%,
|
||||
color-mix(in srgb, var(--akzent) 50%, transparent) 100%);
|
||||
box-shadow:
|
||||
0 0 9px 0 color-mix(in srgb, var(--akzent) 55%, transparent),
|
||||
3px 0 20px -3px color-mix(in srgb, var(--akzent) 42%, transparent);
|
||||
opacity: .9;
|
||||
z-index: 2;
|
||||
}
|
||||
/* Körnung und ein fester Glanz. Kein wandernder wie bei den Kacheln:
|
||||
Diese Fläche wird nicht angeklickt, also gibt es nichts zu quittieren. */
|
||||
.willkommen::after {
|
||||
content: ""; position: absolute; inset: 0; pointer-events: none;
|
||||
border-radius: inherit;
|
||||
background:
|
||||
linear-gradient(104deg,
|
||||
transparent 26%,
|
||||
rgba(255, 255, 255, .05) 40%,
|
||||
rgba(255, 255, 255, .085) 47%,
|
||||
rgba(255, 255, 255, .03) 55%,
|
||||
transparent 70%);
|
||||
/* KEINE Körnung auf DIESER Ebene (07.09.2026, gemessen).
|
||||
|
||||
Sie stand hier als zweite Schicht und hat die Deckkraft der
|
||||
Spiegelung geerbt -- 50 % eines mittelgrauen Rauschens heben jeden
|
||||
Bildpunkt um rund 30 Stufen an. Gemessen: rgb(56,44,58) statt der
|
||||
berechneten rgb(20,26,38), und über einer hellen Stelle des
|
||||
Motivs rgb(85,83,81). Die Karte sah dadurch durchsichtig aus,
|
||||
obwohl sie zu 95 % deckt.
|
||||
|
||||
Derselbe Fehler wie an der Anmeldekarte heute Nachmittag, und
|
||||
genau derselbe Grund: Körnung gehört auf eine EIGENE Ebene mit
|
||||
`mix-blend-mode: overlay` und 3 bis 4 Prozent -- so wie bei den
|
||||
Kacheln der Startseite. Auf einer geteilten Ebene ist sie kein
|
||||
Material, sondern ein grauer Schleier. */
|
||||
opacity: .5;
|
||||
}
|
||||
.willkommen > * { position: relative; z-index: 1; }
|
||||
|
||||
.willkommen__reihe {
|
||||
display: flex; align-items: center; gap: 16px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.willkommen__text { min-width: 0; flex: 1 1 260px; }
|
||||
|
||||
/* Rechts: Glocke neben der Uhr, beide rechtsbündig. `margin-left: auto`
|
||||
statt `justify-content: space-between` am Elternteil -- so bleibt die
|
||||
Gruppe auch dann rechts, wenn der Text davor kurz ist. */
|
||||
.willkommen__rechts {
|
||||
display: flex; align-items: center; gap: 14px;
|
||||
margin-left: auto; flex: 0 0 auto;
|
||||
}
|
||||
/* DER PLATZ WIRD RESERVIERT, NICHT NACHTRÄGLICH GENOMMEN.
|
||||
|
||||
Hier stand `:empty { display: none }` -- und das ist genau der Fehler,
|
||||
den die Kachel darunter schon einmal gemacht hat: Die Glocke wird
|
||||
erst nach der ersten Abfrage eingehängt, und bis dahin war der Platz
|
||||
0 px breit. In dem Moment, in dem sie erscheint, wächst die Zeile,
|
||||
und alles darunter rutscht.
|
||||
|
||||
Ein Sprung ist kein Schönheitsfehler, sondern der Grund, warum man
|
||||
auf den falschen Knopf drückt: Man zielt auf etwas, und im Moment des
|
||||
Klicks rutscht es weg. Gemessen von pruef-tempo-workspace.
|
||||
|
||||
Also 46 px, immer -- ob die Glocke kommt oder nicht. Auf Geräten, auf
|
||||
denen es sie gar nicht gibt (iPhone im Browser), bleibt ein leerer
|
||||
Streifen neben der Uhr; das ist der Preis, und er ist niedriger als
|
||||
ein springendes Bild. */
|
||||
.glocke-platz { width: 46px; height: 46px; flex: none; }
|
||||
|
||||
/* ---------- Die Uhr -------------------------------------------------- */
|
||||
.uhr {
|
||||
position: relative;
|
||||
width: 108px; height: 108px; flex: none;
|
||||
display: grid; place-items: center;
|
||||
border-radius: 50%;
|
||||
/* Das Gehäuse: außen ein Lichtsaum, innen eine dunkle Scheibe. */
|
||||
background:
|
||||
radial-gradient(circle at 50% 34%, rgba(255, 255, 255, .05), transparent 62%),
|
||||
radial-gradient(circle at 50% 50%, #0d131f 62%, #070a11 100%);
|
||||
box-shadow:
|
||||
inset 0 1px 0 rgba(255, 255, 255, .12),
|
||||
inset 0 -2px 6px -3px rgba(0, 0, 0, .9),
|
||||
0 0 0 1px rgba(150, 186, 220, .10),
|
||||
0 10px 24px -14px rgba(0, 0, 0, .9);
|
||||
}
|
||||
/* Die Skala: sechzig feine Striche, aus EINEM sich wiederholenden
|
||||
Kegelverlauf. Sechzig Elemente im HTML wären dieselbe Optik mit
|
||||
sechzig Elementen mehr im Baum. */
|
||||
.uhr__skala {
|
||||
position: absolute; inset: 7px; border-radius: 50%;
|
||||
background: repeating-conic-gradient(from 0deg,
|
||||
rgba(150, 186, 220, .30) 0deg 0.5deg,
|
||||
transparent 0.5deg 6deg);
|
||||
/* Nur ein schmaler Ring davon ist zu sehen -- der Rest wird
|
||||
ausgestanzt. */
|
||||
-webkit-mask: radial-gradient(circle, transparent 0 76%, #000 76% 84%, transparent 84%);
|
||||
mask: radial-gradient(circle, transparent 0 76%, #000 76% 84%, transparent 84%);
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
/* Die Glasscheibe: eine Spiegelung von oben links über der Kuppe. */
|
||||
.uhr__glas {
|
||||
position: absolute; inset: 0; border-radius: 50%;
|
||||
background: linear-gradient(148deg,
|
||||
rgba(255, 255, 255, .10) 0%,
|
||||
rgba(255, 255, 255, .025) 22%,
|
||||
transparent 46%);
|
||||
pointer-events: none;
|
||||
}
|
||||
.uhr__ring {
|
||||
position: absolute; inset: 0; width: 100%; height: 100%;
|
||||
/* Bei Null soll der Ring OBEN beginnen, nicht rechts. */
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
.uhr__bahn, .uhr__minute, .uhr__zeiger {
|
||||
fill: none; stroke-linecap: round;
|
||||
stroke-dasharray: 276.46;
|
||||
}
|
||||
.uhr__bahn { stroke: rgba(150, 186, 220, .11); stroke-width: 3.5; }
|
||||
/* Der Stundenstand: gedeckt, breit, ruhig -- er ändert sich einmal pro
|
||||
Minute und darf nicht um Aufmerksamkeit bitten. */
|
||||
.uhr__minute {
|
||||
stroke: color-mix(in srgb, var(--violett) 62%, transparent);
|
||||
stroke-width: 3.5;
|
||||
stroke-dashoffset: 276.46;
|
||||
}
|
||||
/* Die Sekunde: schmaler, heller, mit einem Hauch Leuchten. */
|
||||
.uhr__zeiger {
|
||||
stroke: var(--akzent); stroke-width: 2.2;
|
||||
stroke-dashoffset: 276.46;
|
||||
filter: drop-shadow(0 0 3px color-mix(in srgb, var(--akzent) 70%, transparent));
|
||||
}
|
||||
.uhr__mitte { display: grid; justify-items: center; gap: 1px; line-height: 1; }
|
||||
.uhr__zeit {
|
||||
font-size: 1.42rem; font-weight: 700; letter-spacing: -.01em;
|
||||
/* Gleiche Zifferbreite: Ohne sie zappelt die Anzeige bei jedem
|
||||
Minutenwechsel, weil die 1 schmaler ist als die 8. */
|
||||
font-variant-numeric: tabular-nums;
|
||||
color: #eaf2fb;
|
||||
text-shadow: 0 0 18px rgba(63, 189, 245, .28);
|
||||
}
|
||||
.uhr__sek {
|
||||
font-size: .72rem; font-weight: 600;
|
||||
font-variant-numeric: tabular-nums;
|
||||
letter-spacing: .16em; text-indent: .16em;
|
||||
color: color-mix(in srgb, var(--akzent) 55%, #ffffff);
|
||||
}
|
||||
|
||||
/* ---------- Die Glocke, wenn sie in der Kachel sitzt ------------------ */
|
||||
/* In der Leiste ist sie ein Knopf unter Knöpfen. Hier steht sie allein
|
||||
neben der Uhr und wird deshalb rund -- sie nimmt die Form ihrer
|
||||
Nachbarin auf, statt als Rechteck danebenzustehen. */
|
||||
.glocke--kachel {
|
||||
width: 46px; height: 46px; padding: 0;
|
||||
border-radius: 50%;
|
||||
justify-content: center;
|
||||
}
|
||||
.glocke--kachel .glocke__text {
|
||||
/* Der Text bleibt für Vorleseprogramme da, verschwindet aber vom
|
||||
Bildschirm: Neben einer Uhr ist Platz für ein Zeichen, nicht für
|
||||
eine Beschriftung. */
|
||||
position: absolute;
|
||||
width: 1px; height: 1px; margin: -1px; padding: 0;
|
||||
overflow: hidden; clip-path: inset(50%); white-space: nowrap;
|
||||
}
|
||||
.glocke--kachel .glocke__zeichen { width: 19px; height: 19px; }
|
||||
|
||||
@media (max-width: 620px) {
|
||||
/* Auf dem Handy rückt die Gruppe unter den Gruß und die Uhr wird
|
||||
kleiner -- 108 px neben einer Überschrift lassen für den Namen
|
||||
keine Zeile mehr übrig. */
|
||||
.willkommen { padding: 18px 16px; }
|
||||
.willkommen__rechts { margin-left: 0; width: 100%; justify-content: flex-start; }
|
||||
.uhr { width: 88px; height: 88px; }
|
||||
.uhr__zeit { font-size: 1.18rem; }
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
/* Die Uhr springt ohnehin -- hier gibt es nichts abzuschalten. Die
|
||||
Zeile steht trotzdem da, damit der nächste, der einen weichen
|
||||
Zeiger einbaut, sie findet. */
|
||||
.uhr__zeiger, .uhr__minute { transition: none; }
|
||||
}
|
||||
@media (forced-colors: active) {
|
||||
.uhr { background: Canvas; box-shadow: none; border: 1px solid CanvasText; }
|
||||
.uhr__skala, .uhr__glas { display: none; }
|
||||
}
|
||||
|
||||
|
||||
/* =====================================================================
|
||||
@@ -4714,3 +4473,63 @@ body[data-fremde-sicht="ja"]::after {
|
||||
.kachel__unter { font-size: .72rem; }
|
||||
.kachel__wasserzeichen { width: 96px; height: 96px; }
|
||||
}
|
||||
|
||||
/* ---------- Die Glocke, wenn sie in der Kachel sitzt ------------------ */
|
||||
/* In der Leiste ist sie ein Knopf unter Knöpfen. Hier steht sie allein
|
||||
neben der Uhr und wird deshalb rund -- sie nimmt die Form ihrer
|
||||
Nachbarin auf, statt als Rechteck danebenzustehen. */
|
||||
/* Sie bekommt dieselbe Bauart wie die Uhr daneben: ein Metallrand
|
||||
aussen, eine vertiefte Scheibe darin. Zwei runde Dinge nebeneinander,
|
||||
die aus verschiedenem Material sind, sehen zusammengesucht aus --
|
||||
dasselbe Material macht daraus ein Paar. Kleiner als die Uhr, weil
|
||||
sie die Nebensache ist. */
|
||||
.glocke--kachel {
|
||||
position: relative;
|
||||
width: 48px; height: 48px; padding: 3px;
|
||||
border-radius: 50%;
|
||||
justify-content: center;
|
||||
border: 0;
|
||||
background:
|
||||
linear-gradient(150deg,
|
||||
rgba(255, 255, 255, .16) 0%,
|
||||
rgba(255, 120, 132, .13) 28%,
|
||||
rgba(8, 12, 20, .9) 54%,
|
||||
rgba(143, 216, 255, .13) 80%,
|
||||
rgba(255, 255, 255, .08) 100%);
|
||||
box-shadow:
|
||||
-2px -2px 16px -11px rgba(255, 95, 109, .5),
|
||||
2px 2px 16px -11px rgba(143, 216, 255, .5),
|
||||
0 8px 20px -12px rgba(0, 0, 0, .9);
|
||||
transition: transform var(--tempo), box-shadow var(--tempo);
|
||||
}
|
||||
.glocke--kachel::before {
|
||||
content: ""; position: absolute; inset: 3px; border-radius: 50%;
|
||||
background:
|
||||
radial-gradient(circle at 50% 28%, rgba(255, 255, 255, .05), transparent 58%),
|
||||
radial-gradient(circle at 50% 50%, #0c121e 58%, #05080e 100%);
|
||||
box-shadow:
|
||||
inset 0 2px 5px -2px rgba(0, 0, 0, .95),
|
||||
inset 0 1px 0 rgba(255, 255, 255, .10);
|
||||
}
|
||||
/* Beim Zeigen hebt sie sich einen Pixel und ihr Schein wird kraeftiger
|
||||
-- dieselbe Sprache wie ueberall: naeherkommen statt aufleuchten. */
|
||||
.glocke--kachel:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow:
|
||||
-3px -3px 20px -9px rgba(255, 95, 109, .7),
|
||||
3px 3px 20px -9px rgba(143, 216, 255, .7),
|
||||
0 10px 24px -12px rgba(0, 0, 0, .95);
|
||||
}
|
||||
.glocke--kachel .glocke__zeichen { position: relative; z-index: 1; }
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.glocke--kachel, .glocke--kachel:hover { transform: none; }
|
||||
}
|
||||
.glocke--kachel .glocke__text {
|
||||
/* Der Text bleibt für Vorleseprogramme da, verschwindet aber vom
|
||||
Bildschirm: Neben einer Uhr ist Platz für ein Zeichen, nicht für
|
||||
eine Beschriftung. */
|
||||
position: absolute;
|
||||
width: 1px; height: 1px; margin: -1px; padding: 0;
|
||||
overflow: hidden; clip-path: inset(50%); white-space: nowrap;
|
||||
}
|
||||
.glocke--kachel .glocke__zeichen { width: 20px; height: 20px; }
|
||||
|
||||
Reference in New Issue
Block a user