Drei Sachen von Filipe, und eine davon war ein Fehler von mir.
1. DER VERMITTLUNGSSERVER HAT NIE EINEN ANRUF GETRAGEN.
Am 18.09. habe ich gemeldet, coturn laufe und sei "von aussen
nachgewiesen". Das war falsch. Im Protokoll: null Zuteilungen, jemals.
Beim ersten echten Versuch "check_stun_auth: Cannot find credentials"
-- in /etc/turnserver.conf fehlte `static-auth-secret`, also suchte
coturn die Zugangsdaten in seiner eigenen Datenbank und wies jeden ab.
Und mein eigenes Werkzeug meldete die ganze Zeit gruen:
"Eingetragen, Geheimnis lesbar, Server antwortet." Jedes Wort wahr --
und keins beantwortete die Frage, um die es geht. Eine STUN-Bindung
fragt "bist du da?", eine Zuteilung fragt "traegst du meinen Anruf?".
`tools/turn-sprache.mjs` (neu) versucht jetzt eine ECHTE Zuteilung und
schickt ein Paket darueber. `turn-einrichten.mjs` benutzt sie und hat
drei Ausgaenge statt zwei: traegt / traegt nicht / konnte nicht
nachsehen. Nach Filipes Reparatur auf dem Server gemessen: Zuteilung
auf Port 49199, Paket angekommen -- von Luxemburg durch Deutschland.
2. UNSERE SEITEN -- die erste Kachel, die HINAUSFUEHRT.
Website und VanVans Shop, mit dem Rabattcode DOGI10. Der Code wurde
nachgesehen, nicht abgeschrieben: partnercodes.json, 10 Prozent,
aktiv, "zum weitergeben an Community" -- und giltAufSale: false,
weshalb der Satz zu reduzierten Artikeln danebensteht. Der zweite Code
dort ist als "nur fuer Filipe persoenlich" vermerkt und steht nirgends.
Auch Name und Beschreibung des Shops stammen von der Seite selbst.
Meine erste Fassung hiess "Van's DIY Bastelbedarf" und nannte "Perlen,
Anhaenger, Werkzeug" -- ausgedacht und falsch. Er heisst mit "&" und
verkauft Haekelwerke, Plushies, Schmuck.
Der Ton der Kachel wurde GESUCHT, nicht gewaehlt: sieben geratene
Blautoene schafften den noetigen Abstand nicht, also 372 600
Kombinationen abgesucht. #087ce7, Abstand 0.310, Kontrast 4.51:1.
3. DIE GANZE VIDEO-KARTE KLICKT -- "egal wo man drauf drückt".
Und hier steckte der lehrreiche Fehler: Zuerst stand der Klick-Block
unten vor `return k`. Diese Funktion hat DREI Rueckgabepunkte, und der
erste lautet `if (!darfEintragen()) { ...; return k; }` -- also genau
fuer die Mitglieder, fuer die Filipe es wollte. Beim Team ging es, bei
der Community nicht. Jetzt haengt er dort, wo `videoWeg` entsteht.
Nicht klickbar bleiben Karten ohne Video und solche, deren Video bei
TikTok geloescht wurde -- sonst fuehrt der Klick auf eine Fehlerseite,
und wir sehen kaputt aus.
GEMESSEN: pruef-wege-nach-draussen (neu) 63 Pruefungen, 0 Fehler, auf
1400 und 412 px. Mit Gegenproben: der Kopierknopf oeffnet nichts, der
eigene Knopf wirkt genau einmal, auf einer Karte ohne Video passiert
nichts. pruef-community-sicht 10/0 auf jetzt 11 Seiten, 0 tote Wege.
Nebenbei: Der Pfeil klebte bei langen Untertiteln am Text (auf dem
Bildschirmfoto gesehen). 0.45rem Abstand.
Co-Authored-By: Claude Opus 5 <[email protected]>
289 lines
7.9 KiB
CSS
289 lines
7.9 KiB
CSS
/* =====================================================================
|
|
UNSERE SEITEN (19.09.2026)
|
|
|
|
Zwei Karten, die aus dem Treff hinausführen: die Website und
|
|
VanVans Shop.
|
|
|
|
WARUM SIE ANDERS AUSSEHEN ALS DIE BRETTER-KACHELN: Sie tun etwas
|
|
anderes. Eine Brett-Kachel öffnet eine Liste im selben Fenster; diese
|
|
hier verlassen den Treff. Dass man das vorher sieht, ist kein
|
|
Schmuck, sondern die Ansage — deshalb der eigene Zuschnitt, der
|
|
deutlich sichtbare Adressname und der Pfeil nach außen.
|
|
|
|
AUGENSCHONEND, WIE ÜBERALL IM HAUS: Die Farbe liegt im Verlauf und
|
|
im Rand, nie in einer leuchtenden Fläche hinter Text. Bewegung gibt
|
|
es nur beim Darüberfahren, und `prefers-reduced-motion` schaltet sie
|
|
ganz ab.
|
|
===================================================================== */
|
|
|
|
.seiten-gitter {
|
|
display: grid;
|
|
gap: 1.1rem;
|
|
/* EINE REGEL STATT EINER ZAHL. Zwei Spalten, sobald zweimal 21rem
|
|
plus Abstand hineinpassen — und sonst eine. Kommt eine dritte
|
|
Karte dazu, ordnet sich das von selbst, ohne dass jemand eine
|
|
Schwelle nachziehen muss. */
|
|
grid-template-columns: repeat(auto-fit, minmax(min(21rem, 100%), 1fr));
|
|
margin: 1.4rem 0 0;
|
|
}
|
|
|
|
.aussen {
|
|
position: relative;
|
|
isolation: isolate;
|
|
overflow: hidden;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: .75rem;
|
|
padding: 1.35rem 1.35rem 1.2rem;
|
|
border-radius: 1.1rem;
|
|
border: 1px solid color-mix(in srgb, var(--aussen-ton) 30%, transparent);
|
|
background:
|
|
radial-gradient(120% 100% at 8% 0%,
|
|
color-mix(in srgb, var(--aussen-ton) 15%, transparent), transparent 62%),
|
|
linear-gradient(160deg,
|
|
color-mix(in srgb, var(--aussen-ton) 7%, #0d1523),
|
|
#0a111d 68%);
|
|
box-shadow: 0 16px 34px -22px color-mix(in srgb, var(--aussen-ton) 75%, transparent);
|
|
cursor: pointer;
|
|
transition: transform .22s ease, border-color .22s ease, box-shadow .22s ease;
|
|
}
|
|
|
|
/* Die Töne der beiden Karten. Sie stehen hier und nicht im HTML,
|
|
damit eine dritte Karte eine Zeile braucht und nicht zehn. */
|
|
.aussen--dogi { --aussen-ton: #087ce7; }
|
|
.aussen--shop { --aussen-ton: #e0559b; }
|
|
|
|
/* Der stille Schein im Hintergrund. Liegt UNTER allem (`z-index: -1`)
|
|
und ist so schwach, dass er bei Tageslicht kaum auffällt — er soll
|
|
Tiefe geben, nicht leuchten. */
|
|
.aussen__schein {
|
|
position: absolute;
|
|
inset: -40% -20% auto -20%;
|
|
height: 78%;
|
|
z-index: -1;
|
|
background: radial-gradient(60% 60% at 50% 50%,
|
|
color-mix(in srgb, var(--aussen-ton) 22%, transparent), transparent 70%);
|
|
filter: blur(26px);
|
|
opacity: .55;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.aussen:hover,
|
|
.aussen:focus-within {
|
|
transform: translateY(-3px);
|
|
border-color: color-mix(in srgb, var(--aussen-ton) 52%, transparent);
|
|
box-shadow: 0 22px 40px -20px color-mix(in srgb, var(--aussen-ton) 85%, transparent);
|
|
}
|
|
|
|
.aussen__kopf {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: .85rem;
|
|
}
|
|
|
|
.aussen__zeichen {
|
|
flex: 0 0 auto;
|
|
display: grid;
|
|
place-items: center;
|
|
width: 3rem;
|
|
height: 3rem;
|
|
border-radius: .8rem;
|
|
border: 1px solid color-mix(in srgb, var(--aussen-ton) 38%, transparent);
|
|
background: linear-gradient(150deg,
|
|
color-mix(in srgb, var(--aussen-ton) 20%, transparent), transparent 74%);
|
|
}
|
|
.aussen__zeichen svg {
|
|
width: 1.65rem;
|
|
height: 1.65rem;
|
|
fill: none;
|
|
stroke: color-mix(in srgb, var(--aussen-ton) 78%, #dceaf8);
|
|
stroke-width: 1.6;
|
|
stroke-linecap: round;
|
|
stroke-linejoin: round;
|
|
}
|
|
|
|
.aussen__marke {
|
|
margin: 0 0 .1rem;
|
|
font-size: .74rem;
|
|
letter-spacing: .12em;
|
|
text-transform: uppercase;
|
|
color: color-mix(in srgb, var(--aussen-ton) 55%, #9fb4c9);
|
|
}
|
|
|
|
.aussen__titel {
|
|
margin: 0;
|
|
font-size: 1.32rem;
|
|
line-height: 1.2;
|
|
/* Text bleibt hell und ruhig. Die Farbe steckt im Rahmen, nicht in
|
|
der Schrift — farbige Überschriften auf dunklem Grund sind der
|
|
schnellste Weg zu müden Augen. */
|
|
color: #e9f2fb;
|
|
}
|
|
|
|
.aussen__satz {
|
|
margin: 0;
|
|
color: var(--text-leise, #93a7bd);
|
|
font-size: .95rem;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
/* Was es auf der Seite gibt. Ruhig gesetzt: Der Punkt links ist ein
|
|
kleiner Strich in der Kartenfarbe, kein Aufzählungszeichen — vier
|
|
bunte Punkte untereinander wären mehr Unruhe als Information. */
|
|
.aussen__liste {
|
|
margin: .1rem 0 .2rem;
|
|
padding: 0;
|
|
list-style: none;
|
|
display: grid;
|
|
gap: .42rem;
|
|
}
|
|
.aussen__liste li {
|
|
position: relative;
|
|
padding-left: 1.05rem;
|
|
font-size: .89rem;
|
|
line-height: 1.45;
|
|
color: var(--text-leise, #93a7bd);
|
|
}
|
|
.aussen__liste li::before {
|
|
content: "";
|
|
position: absolute;
|
|
left: 0;
|
|
top: .62em;
|
|
width: .5rem;
|
|
height: 1px;
|
|
background: color-mix(in srgb, var(--aussen-ton) 60%, transparent);
|
|
}
|
|
|
|
.aussen__weg {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
flex-wrap: wrap;
|
|
gap: .6rem;
|
|
margin: auto 0 0;
|
|
padding-top: .35rem;
|
|
}
|
|
|
|
.aussen__adresse {
|
|
font-size: .82rem;
|
|
color: color-mix(in srgb, var(--aussen-ton) 45%, #8ea3b9);
|
|
word-break: break-all;
|
|
}
|
|
|
|
.aussen__knopf {
|
|
flex: 0 0 auto;
|
|
display: inline-block;
|
|
padding: .55rem 1rem;
|
|
border-radius: .6rem;
|
|
border: 1px solid color-mix(in srgb, var(--aussen-ton) 45%, transparent);
|
|
background: color-mix(in srgb, var(--aussen-ton) 14%, transparent);
|
|
color: #eaf3fc;
|
|
font-weight: 600;
|
|
font-size: .92rem;
|
|
text-decoration: none;
|
|
/* 44 px hoch, damit ein Daumen ihn trifft. */
|
|
min-height: 2.75rem;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
transition: background-color .18s ease, border-color .18s ease;
|
|
}
|
|
.aussen__knopf:hover,
|
|
.aussen__knopf:focus-visible {
|
|
background: color-mix(in srgb, var(--aussen-ton) 26%, transparent);
|
|
border-color: color-mix(in srgb, var(--aussen-ton) 68%, transparent);
|
|
}
|
|
|
|
/* ---- DER GUTSCHEIN ---------------------------------------------------
|
|
|
|
Sieht aus wie ein abgerissener Abschnitt, weil genau das gemeint
|
|
ist: etwas zum Mitnehmen. Die gestrichelte Linie ist das einzige
|
|
Stilmittel — sie sagt "hier abtrennen", ohne ein Wort dafür zu
|
|
brauchen. */
|
|
.gutschein {
|
|
margin: .2rem 0 .1rem;
|
|
padding: .9rem 1rem 1rem;
|
|
border-radius: .8rem;
|
|
border: 1px dashed color-mix(in srgb, var(--aussen-ton) 42%, transparent);
|
|
background: color-mix(in srgb, var(--aussen-ton) 8%, transparent);
|
|
}
|
|
|
|
.gutschein__zeile {
|
|
display: flex;
|
|
align-items: baseline;
|
|
gap: .55rem;
|
|
margin: 0 0 .6rem;
|
|
}
|
|
|
|
.gutschein__prozent {
|
|
font-size: 1.5rem;
|
|
font-weight: 700;
|
|
line-height: 1;
|
|
color: #f2f7fc;
|
|
}
|
|
|
|
.gutschein__wofuer {
|
|
font-size: .88rem;
|
|
color: var(--text-leise, #93a7bd);
|
|
}
|
|
|
|
.gutschein__code {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: .7rem;
|
|
width: 100%;
|
|
min-height: 3rem;
|
|
padding: .6rem .9rem;
|
|
border-radius: .6rem;
|
|
border: 1px solid color-mix(in srgb, var(--aussen-ton) 50%, transparent);
|
|
background: rgba(255, 255, 255, .04);
|
|
color: #f2f7fc;
|
|
cursor: pointer;
|
|
text-align: left;
|
|
transition: background-color .18s ease, border-color .18s ease;
|
|
}
|
|
.gutschein__code:hover,
|
|
.gutschein__code:focus-visible {
|
|
background: rgba(255, 255, 255, .08);
|
|
border-color: color-mix(in srgb, var(--aussen-ton) 72%, transparent);
|
|
}
|
|
|
|
.gutschein__wort {
|
|
font-family: ui-monospace, "SFMono-Regular", "Cascadia Code", monospace;
|
|
font-size: 1.22rem;
|
|
font-weight: 700;
|
|
letter-spacing: .1em;
|
|
}
|
|
|
|
.gutschein__hinweis {
|
|
font-size: .78rem;
|
|
color: var(--text-leise, #93a7bd);
|
|
text-align: right;
|
|
}
|
|
/* Nach dem Kopieren steht dort die Bestätigung — in Grün, aber in
|
|
einem gedeckten, das auf Dunkel nicht sticht. */
|
|
.gutschein__code[data-kopiert="ja"] .gutschein__hinweis { color: #74c79a; }
|
|
|
|
.gutschein__klein {
|
|
margin: .6rem 0 0;
|
|
font-size: .78rem;
|
|
line-height: 1.45;
|
|
color: var(--text-leise, #93a7bd);
|
|
}
|
|
|
|
.seiten-fuss {
|
|
margin: 1.4rem 0 0;
|
|
font-size: .85rem;
|
|
color: var(--text-leise, #93a7bd);
|
|
}
|
|
|
|
/* Wer Bewegung ausgeschaltet hat, bekommt keine. Die Karte bleibt
|
|
trotzdem erkennbar bedienbar — über Rand und Schatten. */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.aussen,
|
|
.aussen__knopf,
|
|
.gutschein__code { transition: none; }
|
|
.aussen:hover,
|
|
.aussen:focus-within { transform: none; }
|
|
}
|