DAS LICHT BLIEB HAENGEN -- vier Ursachen, jede einzeln behoben:
1. EIN WETTLAUF. Zwischen dem Anmelden eines Bildaufbaus und seinem
Ablauf konnte der Zeiger die Karte laengst verlassen haben. Dann hatte
pointerout schon aufgeraeumt, und der Bildaufbau schaltete das Licht
gleich wieder AN. Der haeufigste Fall und der unauffaelligste.
2. UEBER EINE LUECKE VERLASSEN. Wer eine Karte nicht ueber eine
Nachbarkarte verliess, sondern ueber den Zwischenraum, loeste kein
Ereignis aus, das die alte Karte kannte.
3. GESCROLLT, OHNE DIE MAUS ZU BEWEGEN. Die Karte wandert unter dem
stehenden Zeiger weg -- es kommt gar kein Zeigerereignis. Jetzt wird
beim Scrollen nachgesehen, ob die beleuchtete Karte noch unter dem
Zeiger liegt.
4. FENSTER ODER TAB VERLASSEN. Auch dort kommt nichts mehr.
Es gibt jetzt genau EINE beleuchtete Karte -- mehr kann es nicht geben,
es gibt ja nur einen Zeiger. Beim Wechsel geht die alte aus, bevor die
neue angeht.
DIE FARBE GEHOERT ZUR KACHEL. Auf der Wissensseite leuchteten alle sechs
Welten violett, weil die Farbe dort --w heisst und der ganze uebrige
Workspace --ton benutzt. Das Licht griff auf --ton zu, fand nichts und
nahm den Farbton der SEITE. Dieselbe Luecke bei den Aufgaben-Spalten
(--sfarbe), den Kalenderkarten (--afarbe) und den Kalenderzeilen
(--zfarbe). Alle vier setzen jetzt --ton mit.
Nachgewiesen an echten Bildpunkten, nicht am Quelltext: Der Zeiger wird
auf die Aufgaben-Kachel gesetzt (dort muss Rot ueberwiegen: 85 zu 22)
und auf die Kalender-Kachel (dort Blau: 71 zu 13). Ein
Zeichenkettenvergleich haette das nicht gekonnt -- der Browser rechnet
color-mix() aus und schreibt je nach Fassung rgb(), color() oder oklab()
zurueck.
DAS HANDY, komplett durchgeprueft: neue pruef-handy.mjs faehrt alle
fuenfzehn Seiten auf DREI echten Geraetegroessen ab (320 px iPhone SE,
390 px iPhone, 412 px Android) und misst fuenf Dinge, die am Rechner
unsichtbar sind. Gefunden und behoben:
* ZWEI ECHTE UEBERLAEUFE (startcheck +27 px, automation +33 px). Die
Seite liess sich waagerecht schieben -- auf einem Telefon der
schlimmste Fehler. Ursachen: zwoelf Raster mit festem Mindestmass
(minmax(280px, 1fr) kann nicht schrumpfen -> min(280px, 100%)),
zwoelf feste Mindestbreiten an Auswahlfeldern, und ein "flex: none"
an den Stufen-Knoepfen, das jedes Schrumpfen verbot. "width: 100%"
allein reichte dort nicht.
* BERUEHRZIELE unter 24 px (WCAG 2.2, Kriterium 2.5.8). Auswahlfelder
waren 18 bis 22 px hoch. Jetzt 44 px -- die Empfehlung von Apple und
Google, und der Daumen ist nun einmal breiter als ein Mauszeiger.
Nebenbei behebt die Schriftgroesse 16 px das Hineinzoomen von iOS.
* SCHRIFT unter 11,7 px an 52 Stellen. Gesucht wurden sie nicht von
Hand -- das waere ein Ratespiel gewesen und haette die Haelfte
uebersehen -- sondern durch Durchsuchen der Stildateien nach
font-size unter 0,73rem.
ZWEI FEHLER IN DEN EIGENEN PRUEFUNGEN gefunden und behoben: Die
Schriftregel griff zuerst gar nicht (start.css wird VOR den Seitenstilen
geladen, bei gleicher Staerke gewinnt die spaetere -- jetzt mit
body.start qualifiziert), und die Lichtpruefung scrollte 600 px und
stellte nicht zurueck, sodass die folgende Pruefung ins Leere zeigte.
GEGENPROBE gemacht: Mit absichtlich eingebauten Fehlern (8-px-Schrift,
500 px breiter Inhalt) meldet die Handypruefung sofort Rot. Eine
Pruefung, die immer bestaetigt, bestaetigt nichts.
Alle achtzehn Pruefungen laufen gruen.
Co-Authored-By: Claude Opus 5 <[email protected]>
171 lines
6.2 KiB
CSS
171 lines
6.2 KiB
CSS
/* ===================================================================
|
|
Creator-Profil (Onboarding).
|
|
=================================================================== */
|
|
|
|
.gruppe {
|
|
margin: 0 0 22px;
|
|
padding: 20px 22px 22px;
|
|
background: var(--flaeche);
|
|
border: 1px solid var(--rand);
|
|
border-radius: var(--radius);
|
|
}
|
|
|
|
.gruppe__titel {
|
|
padding: 0 6px;
|
|
font-size: .96rem; font-weight: 700;
|
|
color: var(--text);
|
|
}
|
|
.gruppe__text { margin: 2px 0 18px; font-size: .86rem; color: var(--text-still); }
|
|
|
|
.gruppe .feld-schild { margin-top: 14px; }
|
|
.gruppe .feld-schild:first-of-type { margin-top: 0; }
|
|
|
|
.gruppe textarea, .gruppe input {
|
|
width: 100%; padding: 10px 12px;
|
|
background: rgba(255, 255, 255, .045);
|
|
border: 1px solid var(--rand);
|
|
border-radius: var(--radius-klein);
|
|
color: var(--text); font: inherit;
|
|
transition: border-color var(--tempo), box-shadow var(--tempo);
|
|
}
|
|
.gruppe textarea { resize: vertical; min-height: 46px; }
|
|
.gruppe textarea:focus, .gruppe input:focus {
|
|
outline: none; border-color: rgba(63, 189, 245, .7);
|
|
box-shadow: 0 0 0 3px rgba(63, 189, 245, .16);
|
|
}
|
|
/* Siehe aufgaben.css: color-scheme: dark erledigt das Aufhellen. */
|
|
.gruppe input[type="date"]::-webkit-calendar-picker-indicator { cursor: pointer; }
|
|
|
|
.gruppe__raster {
|
|
display: grid; gap: 14px; margin-top: 16px;
|
|
grid-template-columns: repeat(auto-fit, minmax(min(170px, 100%), 1fr));
|
|
}
|
|
|
|
/* Die interne Notiz hebt sich deutlich ab, damit im Gespräch mit dem
|
|
Creator niemand versehentlich hineinschreibt, was er lesen soll. */
|
|
.gruppe--intern {
|
|
border-color: rgba(224, 163, 60, .38);
|
|
background: rgba(224, 163, 60, .05);
|
|
}
|
|
.gruppe--intern .gruppe__titel { color: #e6b45c; }
|
|
|
|
#auswahl-block select {
|
|
min-width: 210px; padding: 10px 12px;
|
|
background: rgba(255, 255, 255, .045);
|
|
border: 1px solid var(--rand); border-radius: var(--radius-klein);
|
|
color: var(--text); font: inherit;
|
|
}
|
|
|
|
.speicher-leiste {
|
|
position: sticky; bottom: 0;
|
|
display: flex; align-items: center; gap: 14px;
|
|
margin-top: 26px; padding: 14px 0;
|
|
background: linear-gradient(180deg, transparent, var(--tinte) 34%);
|
|
}
|
|
|
|
@media (max-width: 560px) {
|
|
.gruppe { padding: 16px 15px 18px; }
|
|
}
|
|
|
|
/* ===================================================================
|
|
Der eigene Steckbrief
|
|
|
|
Steht ganz oben und gehoert JEDEM im Workspace -- nicht nur Creatorn.
|
|
Deshalb sieht er auch anders aus als die Creator-Akte darunter: eine
|
|
geschlossene Karte mit dem Bild links, nicht ein weiteres Formularfeld.
|
|
=================================================================== */
|
|
|
|
.steckbrief {
|
|
position: relative; overflow: hidden;
|
|
margin-bottom: 28px;
|
|
padding: 22px;
|
|
border: 1px solid color-mix(in srgb, var(--ton, var(--akzent)) 22%, var(--rand));
|
|
border-radius: var(--radius);
|
|
background:
|
|
radial-gradient(90% 120% at 0% 0%,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 12%, transparent), transparent 62%),
|
|
var(--flaeche);
|
|
}
|
|
.steckbrief__kopf { display: flex; gap: 24px; align-items: flex-start; flex-wrap: wrap; }
|
|
|
|
.steckbrief__bildfeld { display: grid; gap: 10px; justify-items: center; flex: none; }
|
|
|
|
/* Rund, wie die Plakette in der Begruessung: Ein runder Koerper gehoert
|
|
in dieser Oberflaeche zu einer PERSON, ein eckiger zu einer Sache. */
|
|
.steckbrief__bild {
|
|
display: grid; place-items: center;
|
|
width: 128px; height: 128px; border-radius: 50%;
|
|
overflow: hidden;
|
|
font-size: 3rem; font-weight: 700; line-height: 1;
|
|
color: #f2f7fd;
|
|
border: 1px solid color-mix(in srgb, var(--ton, var(--akzent)) 40%, transparent);
|
|
background:
|
|
radial-gradient(120% 120% at 30% 20%,
|
|
color-mix(in srgb, var(--ton, var(--akzent)) 30%, transparent), transparent 70%),
|
|
rgba(255, 255, 255, .05);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, .1),
|
|
0 14px 34px -16px color-mix(in srgb, var(--ton, var(--akzent)) 70%, transparent);
|
|
}
|
|
.steckbrief__bild img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
|
.steckbrief__bildknoepfe { display: flex; gap: 8px; flex-wrap: wrap; justify-content: center; }
|
|
/* Das Dateifeld ist versteckt; die Beschriftung ist der Knopf. Sie muss
|
|
deshalb auch AUSSEHEN wie einer und den Zeiger aendern. */
|
|
.steckbrief__bildknoepfe label { cursor: pointer; }
|
|
|
|
.steckbrief__text { flex: 1 1 320px; min-width: 0; }
|
|
.steckbrief__name {
|
|
margin: 4px 0 2px;
|
|
font-size: 1.5rem; letter-spacing: -.02em; color: #f2f7fd;
|
|
}
|
|
.steckbrief__rolle {
|
|
margin: 0 0 16px;
|
|
font-size: .78rem; letter-spacing: .12em; text-transform: uppercase;
|
|
color: color-mix(in srgb, var(--ton, var(--akzent)) 62%, #cfe0f0);
|
|
}
|
|
.steckbrief__schild { margin-top: 18px; }
|
|
.steckbrief textarea { width: 100%; }
|
|
|
|
/* ---------- Die Kanaele ---------------------------------------------------
|
|
Gespeichert wird NUR der oeffentliche Name -- kein Login, kein Token
|
|
(Begruendung im Kopf von server/workspace-steckbrief.js). Das @ steht
|
|
deshalb fest vor dem Feld und wird nicht mit eingegeben: So ist ohne
|
|
Erklaerung klar, was hier hingehoert. */
|
|
.steckbrief__kanaele { display: grid; gap: 8px; margin-top: 8px; }
|
|
.kanal {
|
|
display: grid;
|
|
grid-template-columns: 92px minmax(0, 1fr) auto;
|
|
align-items: center; gap: 10px;
|
|
}
|
|
.kanal__name { font-size: .84rem; color: var(--text-leise); }
|
|
.kanal__feld {
|
|
display: flex; align-items: center;
|
|
border: 1px solid var(--rand); border-radius: var(--radius-klein);
|
|
background: rgba(0, 0, 0, .22);
|
|
overflow: hidden;
|
|
}
|
|
.kanal__feld:focus-within { border-color: color-mix(in srgb, var(--akzent) 50%, transparent); }
|
|
.kanal__at { padding: 0 2px 0 11px; color: var(--text-still); }
|
|
.kanal__feld input {
|
|
flex: 1 1 auto; min-width: 0;
|
|
border: 0; background: none; color: var(--text);
|
|
font: inherit; font-size: .88rem;
|
|
padding: 9px 11px 9px 3px;
|
|
}
|
|
.kanal__feld input:focus { outline: none; }
|
|
.kanal__auf { font-size: .78rem; color: var(--akzent); white-space: nowrap; }
|
|
|
|
.steckbrief__fuss {
|
|
display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
|
|
margin-top: 18px;
|
|
}
|
|
.steckbrief__stand { font-size: .82rem; color: var(--text-leise); }
|
|
|
|
@media (max-width: 560px) {
|
|
.steckbrief { padding: 18px 15px; }
|
|
.steckbrief__kopf { gap: 16px; }
|
|
.steckbrief__bild { width: 96px; height: 96px; font-size: 2.2rem; }
|
|
.kanal { grid-template-columns: 1fr; gap: 4px; }
|
|
.kanal__auf { justify-self: start; }
|
|
}
|