Aufgabenbrett: eine Karte ist ein Stueck Arbeit, keine Tabellenzeile

Filipe: "so wie alles gerade ist ist es zu wenig und zu viel zu
gleich". Die Zahl dahinter, an der echten Datenbank gemessen: 115
offene Aufgaben -- aber nur 17 verschiedene. Jede stand acht Mal da.

URSACHE, nicht Symptom: Am 22.09.2026 wurde dieselbe Vorlage zweimal
verteilt, nachgemessen zwischen 16:05:24 und 16:05:53. Zweimal
gedrueckt, weil beim ersten Mal scheinbar nichts passierte. 56 der
115 Karten sind exakte Doppelte.

WAS SICH AENDERT

Aufgaben mit gleichem Titel, gleicher Frist und gleicher Kategorie
stehen jetzt als EINE Karte da: "0 von 8", ein Balken, und die Leute
als Pillen in ihrer Statusfarbe. Wer sie doppelt hat, traegt x2.

Der Hinweis auf die Doppelten steht EINMAL ueber dem Brett, mit Zahl
-- nicht siebzehnmal an den Karten. Eine Warnung, die auf jeder Karte
steht, ist Tapete (Lehre vom 03.09.2026).

Die Spalten wachsen nach dem, was sie tragen: "Offen" mit 17 Karten
bekam vorher genauso viel Platz wie "Erledigt" mit einer -- beide
369 px, gemessen. Innerhalb der Spalte legen sich die Karten
nebeneinander, sobald Platz da ist (auto-fill, keine feste Spaltenzahl).

Das Vorlagenbrett steht oben, solange das Brett leer ist, und wandert
darunter, sobald etwas daliegt. Die urspruengliche Begruendung ("wer
ein leeres Brett hat, soll nicht daran vorbeiscrollen") gilt nur fuer
den leeren Fall.

Am Handy wird aus "Wer hat gerade was" eine wischbare Reihe statt
gestapelter Pillen, mit Randschattierung als Hinweis, dass es
weitergeht.

GEMESSEN (echte Datenlage: 17 Vorlagen, vier Leute, doppelt verteilt)

  Computer  46 077 px -> 2 445 px   (18,8-fach kuerzer)
  Handy     44 216 px -> 5 763 px   ( 7,7-fach kuerzer)
  Brett beginnt am Handy bei 798 statt 901 px -- die erste Aufgabe
  ist damit ohne Scrollen sichtbar.

DREI BEFUNDE NEBENBEI, ALLE VON MIR

1. team.css: Der Schreiben-Knopf auf der Team-Lage stand bei 42 px.
   Am 22.09. habe ich beim Kartenumbau das Polster von 10 auf 9 px
   gesenkt und ihn damit unter die Hausregel gedrueckt. Jetzt
   min-height statt Polsterrechnung -- die Hoehe haengt nicht mehr
   daran, ob jemand spaeter an der Schriftgroesse dreht.

2. chat.css: Die Knoepfe der Aufnahmeleiste standen bei 40 px, der
   Weg-Knopf der GIF-Kiste bei 28. Beide in der Nacht zum 23.09.
   gebaut. Die Leiste bekommt volle 44 px; der GIF-Knopf bleibt klein
   sichtbar und waechst nur in der TREFFERFLAECHE (28 + 2x8 = 44),
   und das nur am Finger -- mit der Maus zielt man genau, eine
   unsichtbar vergroesserte Flaeche waere dort eine Falle.

3. pruef-chat-anhaenge meldete "aus der Kiste genommen (1 uebrig)".
   Kein Codefehler: Die Pruefung setzte `window.confirm = () => true`,
   und heute frueh ist dort der Hausdialog an die Stelle getreten. Sie
   klickte, die Seite fragte, niemand antwortete. Genau der Fall, vor
   dem der Kopf von helfer-nachfrage.mjs seit dem 19.09. warnt -- zum
   zweiten Mal, an einer neuen Stelle. Jetzt ueber `bestaetige`, und
   damit prueft die Zeile ab sofort mit, DASS gefragt wird.

PRUEFUNGEN

pruef-modi-katalog zaehlte Karten und erwartete +1. Seit der
Gruppierung ist das die alte Anordnung, nicht die Sache: Sie zaehlt
jetzt AUFGABEN ueber data-id/data-ids und meldet "2 -> 3 Aufgaben in
2 Karten" -- damit ist beides belegt, das Anlegen und das
Zusammenfassen.

Alles gruen: aufgabenbrett 49, zuteilung 75, bewerbung-aufgaben 101,
modi-katalog 125, chat-anhaenge 109, chat-optik 56, tippziele 11,
teamlage-karten 39, sprung 43, textform 50, formulare 23,
css-klassen 33, zeichen 7, ueberlappung (20 Paare).
Handy-Rundgang: 220 Seitenaufrufe, 112 776 Elemente, 0 Befunde.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-23 16:25:06 +02:00
co-authored by Claude Opus 5
parent 1851d447c3
commit b1319e3124
46 changed files with 1363 additions and 624 deletions
+312 -7
View File
@@ -226,9 +226,46 @@
/* ---------- Brett ----------------------------------------------------- */
/* LEERE SPALTEN NEHMEN SICH ZURUECK (23.09.2026)
Vorher: vier gleich breite Spalten. Am 23.09. standen darin 136, 0,
0 und 1 Karte -- drei Viertel des Bildschirms waren damit belegt,
um dreimal "nichts" zu sagen, waehrend die volle Spalte 46 000 px
nach unten lief.
GRID KANN DAS NICHT, FLEX SCHON. Ein Raster teilt nach Vorschrift,
ein Flussverbund nach Inhalt. Damit schrumpft eine leere Spalte auf
ihre Breite und der Rest bekommt den Platz -- ohne dass irgendwo
eine Zahl steht, die jemand pflegen muesste.
SIE VERSCHWINDEN NICHT. Eine Spalte, die fehlt, kann man auch nicht
fuellen -- und "Zur Freigabe" muss man sehen koennen, um zu
verstehen, dass es den Schritt gibt. */
.brett {
display: grid; gap: 14px;
grid-template-columns: repeat(4, minmax(0, 1fr));
display: flex; flex-wrap: wrap; gap: 14px;
align-items: flex-start;
}
/* Eine volle Spalte waechst, eine leere nicht. `flex: 0 0` statt
`0 1`: Die leere soll auch dann nicht mitwachsen, wenn Platz
uebrig ist -- der gehoert der Arbeit, nicht dem Hinweis, dass
gerade keine da ist. */
.brett > .spalte { flex: var(--wuchs, 1) 1 190px; min-width: 0; }
/* 170 statt 190: Gemessen passten bei 190 nur zwei Kartenreihen in
die volle Spalte (745 px, noetig fuer drei sind 756). Die zwanzig
Pixel je leerer Spalte sind genau der Unterschied -- und sie fehlen
dort niemandem, weil dort nichts steht. */
.brett > .spalte[data-leer="ja"] { flex: 0 0 170px; }
/* DIE KARTEN LEGEN SICH NEBENEINANDER, WENN PLATZ IST.
auto-fill mit einer Mindestbreite statt einer festen Spaltenzahl:
Bei 1600 px passen drei nebeneinander, bei 900 px zwei, am Handy
eine -- und niemand muss dafuer eine Schwelle pflegen. Genau daran
ist am 06.09.2026 die Kopfleiste gescheitert: eine feste Zahl, die
beim sechsten Element nicht mehr stimmte. */
.spalte__karten {
display: grid; gap: 12px;
grid-template-columns: repeat(auto-fill, minmax(244px, 1fr));
align-items: start;
}
@@ -329,7 +366,16 @@
background: color-mix(in srgb, var(--sfarbe) 5%, transparent);
}
@media (max-width: 1080px) { .brett { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* Auf schmalen Schirmen bekommt die volle Spalte die ganze Breite und
die leeren stellen sich nebeneinander darunter -- statt vier
Streifen, die alle zu schmal sind. */
@media (max-width: 1080px) {
.brett > .spalte { flex: 1 1 100%; }
.brett > .spalte[data-leer="ja"] { flex: 1 1 calc(50% - 7px); }
/* Am Handy bleibt eine Karte je Zeile -- zwei nebeneinander waeren
auf 390 px je 180 px breit, und darauf passt kein Titel. */
.spalte__karten { grid-template-columns: 1fr; }
}
@media (max-width: 620px) { .brett { grid-template-columns: 1fr; } }
/* ---------- Bearbeiten-Dialog ------------------------------------------ */
@@ -1278,9 +1324,16 @@
border-radius: var(--radius);
background: color-mix(in srgb, var(--flaeche) 92%, transparent);
}
.z-band__kopf { margin-bottom: 12px; }
/* Ueberschrift und Erklaerung stehen nebeneinander, nicht
uebereinander. Der Satz ist eine Fussnote zur Ueberschrift, keine
zweite Ueberschrift -- und zwei Zeilen fuer eine Auskunft sind auf
einer Seite, die ohnehin zu lang ist, eine zu viel. */
.z-band__kopf {
margin-bottom: 10px;
display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px;
}
.z-band__titel { margin: 0; font-size: 1.05rem; }
.z-band__satz { margin: 4px 0 0; color: var(--text-leise); font-size: .9rem; }
.z-band__satz { margin: 0; color: var(--text-leise); font-size: .84rem; }
/* Die Zahlen. Groß genug, um sie von oben zu erfassen, ohne zu lesen. */
.z-band__zahlen { display: flex; flex-wrap: wrap; gap: 10px; }
@@ -1297,7 +1350,23 @@
.zk--warn { border-color: color-mix(in srgb, #ffb4a2 55%, var(--rand)); }
/* ---- Die Übersicht über alle ---------------------------------------- */
.z-leute { display: flex; flex-direction: column; gap: 6px; }
/* AUS GESTAPELTEN ZEILEN WIRD EINE REIHE (23.09.2026)
Gemessen: Dieser Block nahm bei vier Leuten 330 px ein -- ein
Drittel des Bildschirms, bevor die erste Aufgabe zu sehen war. Das
Brett begann dadurch erst bei 802 px.
Eine Zeile je Person war richtig gedacht, solange es um LESEN ging:
Name links, Marken rechts, ordentlich untereinander. Aber man liest
hier nicht, man SUCHT -- "wer hat zu viel?" -- und dafuer ist
nebeneinander besser als untereinander. Vier Namen in einer Reihe
vergleicht man mit einem Blick; vier Zeilen muss man abfahren.
flex-wrap statt einer festen Spaltenzahl: Bei zwanzig Leuten
bricht es von selbst um, ohne dass irgendwo eine Zahl steht, die
jemand beim naechsten Zugang nachziehen muesste. */
.z-leute { display: flex; flex-wrap: wrap; gap: 6px; }
.z-leute > .z-person { flex: 0 1 auto; }
.z-person {
display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
/* 44 px am Finger -- Hausregel. Hier über die Polsterung, nicht über
@@ -1317,7 +1386,10 @@
border-color: var(--akzent);
box-shadow: inset 3px 0 0 var(--akzent);
}
.z-person__name { font-weight: 600; min-width: 7rem; }
/* Die feste Mindestbreite war fuer die Zeilenform da -- sie hat die
Namen untereinander ausgerichtet. In der Reihe macht sie aus einem
kurzen Namen eine breite Luecke. */
.z-person__name { font-weight: 600; }
.z-person__marken { display: flex; flex-wrap: wrap; gap: 6px; }
.z-marke {
@@ -1467,3 +1539,236 @@
@media (prefers-reduced-motion: reduce) {
.z-person { transition: none; }
}
/* =====================================================================
DIE SAMMELKARTE (23.09.2026)
Filipe: "so wie alles gerade ist ist es zu wenig und zu viel zu
gleich ... ich will das beste vom besten."
Eine Karte ist seither ein STUECK ARBEIT und nicht eine Zeile aus
der Datenbank. Sitzen vier Leute an derselben Sache, steht sie
einmal da -- mit den vieren darauf.
Die Begruendung und die gemessenen Zahlen stehen in aufgaben.js bei
gruppieren(). Hier steht nur, wie es aussieht.
===================================================================== */
.karte--sammel { --sammelton: var(--sfarbe, #6f89a8); }
/* Wie weit die Gruppe ist -- als Zahl. Rechts oben, wo sonst der
Stift steht: Es ist die Auskunft, die man auf einer Sammelkarte
zuerst sucht. */
.sammel__stand {
flex: 0 0 auto;
font-size: .78rem; font-variant-numeric: tabular-nums;
padding: 3px 9px; border-radius: 999px;
color: var(--text-leise);
border: 1px solid var(--rand);
background: color-mix(in srgb, var(--flaeche) 70%, transparent);
}
.sammel__stand[data-fertig="ja"] {
color: #8fd9b4;
border-color: color-mix(in srgb, #4dab77 45%, transparent);
background: color-mix(in srgb, #4dab77 14%, transparent);
}
/* Derselbe Stand noch einmal fuers Auge. ZUSAETZLICH zur Zahl, nicht
statt ihrer -- ein Balken allein laesst sich nicht vorlesen und
nicht ablesen, wenn man Farben schlecht unterscheidet. */
.sammel__balken {
height: 4px; border-radius: 999px; overflow: hidden;
background: color-mix(in srgb, var(--rand) 70%, transparent);
margin: 2px 0 9px;
}
.sammel__balken > span {
display: block; height: 100%;
width: calc(var(--anteil, 0) * 1%);
border-radius: 999px;
background: linear-gradient(90deg,
color-mix(in srgb, #4dab77 70%, transparent), #4dab77);
}
/* Der Text wird gekuerzt, nicht weggenommen. Auf der Sammelkarte
stand er vorher VIERMAL untereinander -- einmal je Person, und
jedes Mal derselbe Satz. */
/* ZWEI ZEILEN, NICHT DREI. Auf der Sammelkarte ist der Text bei
allen Beteiligten derselbe -- er steht also ohnehin nur noch
einmal statt achtmal. Zwei Zeilen reichen, um zu erkennen, worum
es geht; wer mehr braucht, klappt auf. */
.karte__text--kurz { font-size: .86rem; margin: 6px 0 0; }
.sammel__mehr {
align-self: flex-start;
border: 0; background: none; padding: 4px 0; margin: 0 0 4px;
font: inherit; font-size: .78rem; color: var(--text-leise);
text-decoration: underline; text-underline-offset: 3px; cursor: pointer;
}
.sammel__mehr:hover { color: var(--text); }
.sammel__mehr:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
/* ---- Die Leute ----------------------------------------------------
Jeder Name traegt seinen eigenen Stand. Das ist der Punkt, an dem
die Sammelkarte MEHR zeigt als die vier Einzelkarten vorher: Dort
musste man vier Karten suchen, die dreissig Karten auseinanderlagen,
um dieselbe Frage zu beantworten. */
.sammel__leute { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.sammel__person {
display: inline-flex; align-items: center; gap: 6px;
min-height: 34px; padding: 4px 10px 4px 8px;
border-radius: 999px; cursor: pointer;
font: inherit; font-size: .8rem; color: var(--text);
border: 1px solid var(--rand);
background: color-mix(in srgb, var(--flaeche) 62%, transparent);
}
.sammel__person:hover { border-color: var(--rand-hell); }
.sammel__person:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
.sammel__punkt {
width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto;
background: var(--pton, #6f89a8);
}
.sammel__person[data-status="offen"] { --pton: #6f89a8; }
.sammel__person[data-status="arbeit"] { --pton: #3fbdf5; }
.sammel__person[data-status="review"] { --pton: #e0a33c; }
.sammel__person[data-status="erledigt"] { --pton: #4dab77; }
/* Wer fertig ist, tritt zurueck. Nicht durchgestrichen -- das liest
sich wie "faellt weg", und die Arbeit ist ja getan, nicht
abgesagt. */
.sammel__person[data-status="erledigt"] { color: var(--text-leise); }
.sammel__person[data-status="erledigt"] .sammel__punkt { box-shadow: none; }
/* Und der Rand nimmt die Farbe auf, damit man die Gruppe auch ohne
die Punkte lesen kann. */
.sammel__person { border-color: color-mix(in srgb, var(--pton, #6f89a8) 30%, var(--rand)); }
/* Steht jemand doppelt drin, steht es AN der Person. */
.sammel__mal {
font-size: .72rem; font-variant-numeric: tabular-nums;
padding: 1px 5px; border-radius: 999px;
color: #f2c94c;
background: color-mix(in srgb, #e0a33c 18%, transparent);
border: 1px solid color-mix(in srgb, #e0a33c 40%, transparent);
}
.sammel__person[data-doppelt="ja"] { border-color: color-mix(in srgb, #e0a33c 45%, var(--rand)); }
.sammel__doppelt {
margin: 8px 0 0; font-size: .78rem; line-height: 1.5;
color: #e6c169;
}
/* Die kleine Zeile im Spaltenkopf: wie viele Aufgaben aus den
Stuecken Arbeit geworden sind. */
.spalte__summe {
margin: -2px 0 10px; font-size: .76rem; color: var(--text-leise);
}
@media (prefers-reduced-motion: no-preference) {
.sammel__balken > span { transition: width .2s ease; }
}
@media (forced-colors: active) {
.sammel__person { border: 1px solid CanvasText; }
.sammel__person[data-doppelt="ja"] { border: 2px solid Highlight; }
.sammel__balken { border: 1px solid CanvasText; }
}
/* Die Sammelkarte darf enger sitzen als eine Einzelkarte: Auf ihr
steht weniger Text und mehr Struktur. Gemessen waren es 330 px je
Karte -- bei siebzehn Karten ist jede eingesparte Zeile ein halber
Bildschirm. */
.karte--sammel { padding: 13px 14px 14px; gap: 0; }
.karte--sammel .karte__titel { font-size: .97rem; line-height: 1.35; }
.karte--sammel .karte__zeile { margin-top: 8px; }
.inhalt--brett { max-width: 1560px; }
/* Der Kopfbereich bleibt lesbar schmal -- er ist Text, kein Brett.
Ohne das stuende der Satz "136 Aufgaben stehen an" auf einem
breiten Schirm ueber anderthalb Meter. */
.inhalt--brett > .kopf-zeile,
.inhalt--brett > .lage,
.inhalt--brett > #vorlagenbrett,
.inhalt--brett > .neu { max-width: 1240px; }
/* ---- Das Doppelt-Band ---------------------------------------------
Steht ueber dem Brett und nur dann, wenn wirklich etwas doppelt
ist. Gelb und nicht rot: Es ist eine Unsauberkeit, kein Ausfall --
niemand muss deshalb etwas stehen und liegen lassen. */
.doppelband {
display: flex; align-items: center; gap: 13px;
margin: 0 0 14px; padding: 12px 16px;
border-radius: var(--radius);
border: 1px solid color-mix(in srgb, #e0a33c 38%, var(--rand));
background: linear-gradient(180deg,
color-mix(in srgb, #e0a33c 11%, transparent), transparent 70%), var(--flaeche);
}
.doppelband__zahl {
flex: 0 0 auto;
min-width: 2.6rem; height: 2.6rem;
display: flex; align-items: center; justify-content: center;
border-radius: 999px;
font-size: 1.05rem; font-weight: 700; font-variant-numeric: tabular-nums;
color: #f2c94c;
background: color-mix(in srgb, #e0a33c 16%, transparent);
border: 1px solid color-mix(in srgb, #e0a33c 42%, transparent);
}
.doppelband__text { display: grid; gap: 2px; min-width: 0; }
.doppelband__text > span { color: var(--text-leise); font-size: .86rem; line-height: 1.5; }
@media (forced-colors: active) { .doppelband { border: 1px solid CanvasText; } }
/* Voller Name oder Anfangsbuchstabe -- nie beides. */
.sammel__kurz { display: none; }
@media (max-width: 620px) {
.sammel__voll { display: none; }
.sammel__kurz {
display: inline-block; min-width: 1.05rem; text-align: center;
font-weight: 600; font-variant-numeric: tabular-nums;
}
/* Ohne den Namen braucht die Pille weniger Polster -- sonst waeren
es vier gleich grosse Kaesten mit viel Luft. */
.sammel__person { padding: 4px 8px; gap: 5px; }
}
/* ---- Am Handy wird aus der Reihe eine ROLLE ------------------------
Gemessen am 23.09.2026 auf 390 px: Die vier Leute brauchten dort
260 px, weil je Zeile nur zwei Pillen nebeneinander passen. Zusammen
mit dem Doppelt-Band begann das Brett erst bei 901 px -- also nach
einem vollen Bildschirm.
Nebeneinander in EINER Zeile, zum Wischen: Das ist dieselbe
Anordnung wie am grossen Schirm, nur laenger als das Fenster. Wer
jemand Bestimmten sucht, wischt; wer nur wissen will, ob jemand zu
viel hat, sieht die ersten drei und die Randschattierung sagt ihm,
dass es weitergeht.
KEIN Umbruch mehr auf schmalen Geraeten -- `nowrap` statt einer
Schwelle, ab der eine bestimmte Zahl Pillen passt. Eine solche Zahl
waere beim naechsten Namen falsch. */
@media (max-width: 620px) {
.z-leute {
flex-wrap: nowrap;
overflow-x: auto;
/* Der Finger soll waagerecht wischen, ohne dass die Seite
darunter mitwandert. */
overscroll-behavior-x: contain;
scroll-snap-type: x proximity;
/* Platz fuer den Rollbalken, damit er nichts verdeckt. */
padding-bottom: 6px;
/* Der Rand darf nicht abschneiden: Die letzte Pille soll bis an
die Kante rollen koennen. */
margin-inline: -2px; padding-inline: 2px;
}
.z-leute > .z-person { flex: 0 0 auto; scroll-snap-align: start; }
/* Eine schmale Schattierung am rechten Rand sagt: hier geht es
weiter. Ohne sie sieht eine abgeschnittene Pille aus wie ein
Darstellungsfehler. */
.z-band--team .z-leute {
-webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 26px), transparent 100%);
mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 26px), transparent 100%);
}
/* Das Doppelt-Band: die Kugel kleiner, der Satz enger. Der Inhalt
bleibt vollstaendig -- er ist der Grund, warum das Brett ueberhaupt
so voll ist. */
.doppelband { gap: 10px; padding: 10px 13px; }
.doppelband__zahl { min-width: 2.2rem; height: 2.2rem; font-size: .95rem; }
.doppelband__text > span { font-size: .82rem; line-height: 1.45; }
}
+23
View File
@@ -2678,6 +2678,29 @@
klein; gewachsen ist die Flaeche, die den Finger annimmt. */
@media (pointer: coarse) {
.chat__kachelknopf { min-width: 44px; min-height: 44px; }
/* Die zwei Knoepfe der Aufnahmeleiste standen bei 40 px -- vier zu
wenig. Gebaut wurden sie in der Nacht zum 23.09.2026; gefunden hat
es der Rundgang am Morgen. In der Aufnahmeleiste ist Platz, also
braucht es hier keine Abwaegung: volle Hausgroesse. */
.tonleiste__weg,
.tonleiste__senden { min-width: 44px; min-height: 44px; }
/* UNSICHTBAR GROESSER, SICHTBAR KLEIN.
Die Abwaegung beim Knopf selbst stimmt: 44 px sichtbar wuerden die
halbe Kachel verdecken. Sie war aber nur halb zu Ende gedacht --
ein Ziel, das man nicht trifft, hilft auch niemandem.
Deshalb waechst nicht der Knopf, sondern seine TREFFERFLAECHE:
28 + 2x8 = 44 px. Man sieht weiter einen kleinen Kreis in der Ecke
und trifft ihn trotzdem mit dem Daumen.
NUR AM FINGER. Mit einer Maus zielt man genau; eine unsichtbare
Flaeche, die acht Pixel ueber den Knopf hinausragt, waere dort
keine Hilfe, sondern eine Falle -- man traefe ihn, ohne ihn
anvisiert zu haben. */
.gif-kachel__weg::after {
content: ""; position: absolute; inset: -8px;
}
}
.chat__kachelknopf:hover { border-color: var(--akzent); }
.chat__kachelknopf:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; }
+14 -1
View File
@@ -933,8 +933,21 @@
}
/* ---- Der Weg in den Chat --------------------------------------------- */
/* 44 px HOCH, UND ZWAR GERECHNET STATT ZUSAMMENGEZAEHLT.
Am 22.09.2026 habe ich beim Kartenumbau das Polster von 10 auf
9 px gesenkt, um die Karte kompakter zu machen -- und damit den
Knopf auf 42 px gedrueckt. Zwei Pixel unter der Hausregel fuer
etwas, das man mit dem Finger trifft; gefunden hat es erst der
Handy-Rundgang einen Tag spaeter.
min-height statt einer Polsterzahl: Die Hoehe haengt damit nicht
mehr daran, ob jemand spaeter am Polster oder an der Schriftgroesse
dreht. flex + center, damit der Text dabei mittig bleibt -- ein
Block mit min-height wuerde ihn nach oben kleben. */
.tschreiben {
display: block; margin: 2px 0 14px;
display: flex; align-items: center; justify-content: center;
min-height: 44px;
margin: 2px 0 14px;
padding: 10px 14px;
border: 1px solid color-mix(in srgb, var(--r) 34%, transparent);
border-radius: var(--radius-klein);