Die Modi-Seite gehoert Dogi und den Modis -- Wand, Zeichen, Reiter

Filipe zum Bildschirmfoto der Zugangswand auf crew.: "alles soll auf
dogfather und die modis perfektionniert werden auf der neuen modi seite."

Dort stand bis eben die gewohnte Wand: Spicy-Media-Logo, "Creator
Workspace", der Satz ueber Manager, Scouts und Creator, fuenf
Rollenkacheln. Fuer einen Modi war davon nichts richtig.

DIE KACHELREIHE FAELLT WEG, und das ist eine Verbesserung: Eine Reihe mit
genau einem Eintrag ist keine Auswahl, sondern eine Huerde -- man muesste
erst daraufdruecken, bevor das Codefeld etwas annimmt. gate.js prueft
jetzt, OB es Kacheln gibt, statt sie vorauszusetzen.

DIE BUEHNE IST AUS DEM VORHANDENEN MOTIV GEBAUT, nicht neu erfunden, und
das ist kein Sparen: Die Anmeldeseite ist eine MECHANIK. Rechts steht im
Bild eine leere Tafel, und gate.css setzt die Karte auf Hundertstel genau
dort hinein. Ein frei erfundenes Bild haette diese vier Zahlen
mitgenommen. Also dieselbe Szene, ueber den Mischmodus "color" ins Blau
umgefaerbt (hue-rotate haette Rot nach Cyan UND Blau nach Gelb gedreht),
Dogi anstelle des Spicy-Medaillons, "TEAM DOGI" darunter.
Gemessen: rote Bildpunkte 18,1 % -> 0,0 %, Karte auf 0 px genau.

NACH DER ANMELDUNG geht es weiter: kopf.js zieht Reitertitel und Zeichen
aus `ich.marke` nach -- "Aufgaben · Team Dogi" statt "· Spicy & Dogi", mit
dem eigenen Symbol. An einer Stelle statt in 30 HTML-Dateien.

DREI FUNDE, DIE NICHT AUS DEM KOPF KAMEN

1. DER KNOPF WAERE SCHLECHTER LESBAR GEWORDEN. Mein erstes Blau endete
   bei #4aa4cf -- weisse Schrift darauf: 2,8 zu 1. Der rot-blaue Verlauf,
   den er ersetzt, haelt ueber seine GANZE Laenge 4,65; er war offenbar
   genau darauf gebaut. Jetzt 5,10 zu 1, am fertigen Bildschirmfoto
   gemessen statt aus einer einzelnen Farbe hergeleitet.

2. DIE NEUE WAND WAR AUCH AUF workspace. ABRUFBAR. Sie liegt als Datei im
   selben Ordner. Aufgefallen ist das, weil der Wortleck-Test sie ueberhaupt
   las -- die Frage WARUM war die Antwort. Ausserhalb von crew. antwortet
   sie jetzt mit 404; auf den Pruefadressen bleibt sie erreichbar, sonst
   koennte die Pruefung sie nicht mehr oeffnen und waere gruen ohne etwas
   zu messen.

3. ZWEI GLEICHE KACHELN AUF DER STARTSEITE, seit dem letzten Deploy live.
   Die Team-Lage-Kachel von heute Mittag hatte Name, Zeichen, Ton UND
   Gruppe einer schon vorhandenen -- fuehrte aber woandershin. Gefunden
   von "jede Kachel hat ihre eigene Farbe (23 Farben auf 24 Kacheln)".
   Jetzt "Eingang", Gruppe Taeglich, neuer Ton 24 (#8a20cf, Abstand 38,5
   im CIELAB-Raum; reines Blau haette 52 gehabt und waere auf dunklem
   Grund am schlechtesten zu fokussieren). Eine Fehlermeldung zeigte
   dadurch auf die falsche Seite -- ebenfalls behoben.
   Und die Pruefung, die es fand, zaehlte nur bereiche.js: Vom Server
   angehaengte Kacheln kannte sie nicht. Sie fragt jetzt beide Quellen.

Der Wortleck-Test meldete ausserdem sieben Fundstellen -- allesamt
Kommentare, die ich beim Bauen selbst geschrieben hatte.

GEMESSEN
pruef-crew-adresse     103   pruef-crew-wand-bild    43 (neu)
pruef-modi-checkliste   59   pruef-modi-verborgen    75
pruef-rollen           245   pruef-zwischenspeicher  21
pruef-modi-wortleck      4   pruef-start-ansicht     gruen

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-10 13:59:54 +02:00
co-authored by Claude Opus 5
parent 3cda64568d
commit 8bcbd83061
46 changed files with 1669 additions and 286 deletions
+87
View File
@@ -2273,6 +2273,20 @@ body.gate {
color: #a9dcff;
text-shadow: 0 1px 10px rgba(99, 184, 238, .45);
}
/* TEAM DOGI (10.09.2026, nur auf crew.dogfather-universe.com).
Bewusst NICHT .marke__spicy mitbenutzt, obwohl es dieselbe Stelle im
Satz ist: Die Klasse ist rosarot, weil dort "SpicyMedia" steht. Auf
dieser Seite waere das der einzige warme Fleck auf einer durchweg
blauen Seite -- und er saesse ausgerechnet auf dem Namen, der dort
NICHT hingehoert.
Silbrig wie der Schriftzug im Hintergrundbild, damit beide dasselbe
sagen. */
.marke--paar .marke__crew {
color: #dce9f3;
text-shadow: 0 1px 10px rgba(150, 190, 220, .45);
}
.marke--paar .marke__x {
/* Kleiner, leiser, und mit etwas Luft -- es verbindet, es benennt
nicht. */
@@ -2696,3 +2710,76 @@ body.gate {
radial-gradient(1.1px 1.1px at 63% 72%, rgba(226, 238, 250, .38), transparent),
radial-gradient(1.6px 1.6px at 84% 26%, rgba(255, 255, 255, .3), transparent);
}
/* =====================================================================
DIE ZWEITE ZUGANGSWAND (10.09.2026)
Nur crew-index.html traegt `gate--crew`. Hier stehen die wenigen
Stellen, an denen die gemeinsame Gestaltung nicht passt -- und zwar
NUR die.
ES GEHT NICHT UM GESCHMACK, SONDERN UM DAS BILD DAHINTER.
Die Karte holt sich absichtlich die Farben des gemalten Rahmens
herein: rot oben links, blau unten rechts, "das, was die Karte mit
dem Bild verbindet, statt sie davorzusetzen" (Begruendung weiter
oben). Auf der zweiten Buehne ist der Rahmen aber RINGSUM blau -- die
Szene wurde umgefaerbt. Das Rot verbindet dort also nichts mehr,
sondern widerspricht dem Bild.
Dieselbe Ueberlegung beim Anmeldeknopf: Sein Verlauf lief von Rot
nach Blau, weil er die beiden Marken aufnahm. Auf dieser Seite gibt
es nur eine.
===================================================================== */
/* Der Knopf: von tiefem zu hellerem Blau statt von Rot nach Blau.
DIE HELLIGKEIT IST NACHGERECHNET, NICHT GEWAEHLT. Der erste Entwurf
endete bei #4aa4cf -- huebsch, und weisse Schrift darauf haette nur
2,8 zu 1 gehabt. Der rot-blaue Verlauf, den er ersetzt, haelt ueber
seine GANZE Laenge 4,65 zu 1; er war offenbar genau darauf gebaut.
Ein hellerer Knopf sieht kraeftiger aus und ist schlechter zu lesen
-- das ist kein Tausch, den man nebenbei macht.
Jede Stufe hier liegt bei mindestens 5 zu 1 gegen Weiss. Gemessen
wird das in pruef-crew-wand-bild.mjs am fertigen Bildschirmfoto, denn
ein Verlauf laesst sich nicht aus einer einzelnen Farbe beurteilen. */
body.gate--crew #knopf {
background:
linear-gradient(100deg, #17527f 0%, #205f8c 34%, #2f6f9a 74%, #3a7699 100%);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .28),
inset 0 -2px 0 rgba(0, 0, 0, .22),
0 10px 26px -14px rgba(64, 146, 200, .9),
0 10px 26px -16px rgba(126, 200, 242, .8);
}
body.gate--crew #knopf:hover:not([disabled]) {
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .34),
inset 0 -2px 0 rgba(0, 0, 0, .22),
0 14px 30px -12px rgba(64, 146, 200, .95),
0 14px 30px -14px rgba(126, 200, 242, .85);
}
/* Die Karte in der gemalten Tafel. WORTGLEICH dieselbe Bedingung wie
oben -- nicht global: Auf schmalen Geraeten hat die Karte einen
anderen Aufbau, und ein globales `background` haette den ueberschrieben.
Nur die zwei roten Werte werden blau, alles andere bleibt Zeile fuer
Zeile wie es war. */
@media (min-width: 1100px) and (min-height: 620px) and (min-aspect-ratio: 7/5) {
body.gate--crew .tafel {
background:
radial-gradient(135% 100% at 0% 0%, rgba(96, 168, 224, .24), transparent 55%),
radial-gradient(135% 100% at 100% 100%, rgba(56, 158, 246, .30), transparent 58%),
linear-gradient(176deg,
rgba(16, 23, 36, .93) 0%,
rgba(9, 13, 21, .95) 46%,
rgba(5, 7, 13, .96) 100%);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, .11),
inset 0 -1px 0 rgba(0, 0, 0, .5),
inset 2px 2px 0 -1px rgba(120, 190, 240, .32),
inset -2px -2px 0 -1px rgba(56, 158, 246, .38),
inset 0 0 54px -20px rgba(0, 0, 0, .92);
}
}
+13
View File
@@ -949,6 +949,19 @@ body.start > main { position: relative; z-index: 1; }
sieht abgeschaltet aus. Gedeckt statt grell, wie alles hier. */
[data-ton="23"] { --ton: #5f8a9f; } /* Ideen-Board */
/* Ton 24 (10.09.2026, Eingang). Wieder gerechnet statt gewaehlt, und bei
23 belegten Toenen wird es eng: Der Abstand im CIELAB-Raum zum
naechsten Nachbarn betraegt 38,5 -- die weichen Violett-Toene, die
zuerst naheliegend schienen, lagen alle zwischen 13 und 26, weil
Ton 19 (#796ce0) und Ton 8 (#c06ad0) diesen Bereich schon besetzen.
Reines Blau haette mit 52 den groessten Abstand gehabt und wurde
verworfen: stark gesaettigtes Blau ist auf dunklem Grund am
schlechtesten zu fokussieren. Kraeftiges Gruen kam auf 39,5, hat aber
L* 81 und wuerde leuchten. Dieser Ton hat eine Leuchtdichte von 0,109
-- dunkel genug, um neben den anderen ruhig zu bleiben. */
[data-ton="24"] { --ton: #8a20cf; } /* Eingang */
/* Rückfallwert für alles, was einen Ton braucht, aber keine Nummer hat.
Steht bewusst in :where() -- damit zählt die Zeile beim Wettstreit der
Regeln als NICHT vorhanden und die Nummer oben gewinnt immer. Ohne
Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

+19 -2
View File
@@ -31,6 +31,19 @@
const SPEICHER = 'dfw.rolle';
let gewaehlt = null;
/* AUF DER ZWEITEN ADRESSE GIBT ES KEINE KACHELN (10.09.2026).
Dort fuehrt genau eine Sorte Zugang hinein, also ist nichts zu
waehlen -- jene Wand liefert die Reihe erst gar nicht mit.
Geprueft wird deshalb, OB es Kacheln gibt, statt sie
vorauszusetzen. Ohne diese Zeile bliebe `gewaehlt` dort ewig null,
und der Anmeldeknopf antwortete auf jeden Druck mit "Bitte zuerst
auswaehlen, womit du dich anmeldest" -- vor einer Seite, auf der es
nichts auszuwaehlen gibt. Die Anmeldung waere unbenutzbar gewesen,
und zwar ohne Fehlermeldung im Protokoll. */
const ohneKacheln = rollen.length === 0;
/* ---------- Rolle wählen ------------------------------------------ */
function waehle(rolle, fokus = false) {
@@ -99,7 +112,7 @@
e.preventDefault();
const wert = code.value.trim();
if (!gewaehlt) { melde('Bitte zuerst auswählen, womit du dich anmeldest.'); rollen[0].focus(); return; }
if (!ohneKacheln && !gewaehlt) { melde('Bitte zuerst auswählen, womit du dich anmeldest.'); rollen[0].focus(); return; }
if (!wert) { melde('Bitte den Zugangscode eingeben.'); code.focus(); return; }
melde('');
@@ -109,7 +122,11 @@
const antwort = await fetch('/workspace/api/anmelden', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ rolle: gewaehlt, code: wert }),
/* Ohne Kacheln geht ein leerer Rollenname mit. Der Server
braucht ihn dort nicht: Er prueft den verborgenen Zugang
VOR dem gewohnten Weg, und ein leerer Name faellt danach in
dieselbe Antwort wie ein erfundener. */
body: JSON.stringify({ rolle: gewaehlt || '', code: wert }),
credentials: 'same-origin',
});
+46 -3
View File
@@ -57,6 +57,42 @@
for (const verweis of document.querySelectorAll('.kopfleiste .marke__text .zurueck')) {
verweis.textContent = String(ich.marke).replace(/ /g, ' ');
}
/* DER REITER UND DAS ZEICHEN GEHOEREN DAZU (10.09.2026).
Die Kopfleiste allein reicht nicht. In jeder Seite steht fest
<title>Aufgaben · Spicy & Dogi</title> und daneben das Zeichen
des Workspace -- beides sieht man als Erstes, im Browserreiter
und, wenn die Seite als App laeuft, im Fensterrahmen und beim
Umschalten zwischen Apps.
WARUM HIER UND NICHT IN 30 HTML-DATEIEN: Der Name kommt vom
Server und haengt an der Person. Er kann also gar nicht fest im
HTML stehen -- und 30 Dateien zu pflegen hiesse, die 31. zu
vergessen.
Der Seitenname bleibt stehen, nur der Teil hinter dem Punkt
wechselt. Auf der Startseite steht dort der Name des Bereichs
selbst; dann bleibt nur die Marke uebrig, statt sie doppelt zu
lesen. */
const marke = String(ich.marke);
const stueck = document.title.split(' · ');
const seitenname = stueck.slice(0, -1).join(' · ').trim();
document.title = (!seitenname || seitenname === 'Creator Workspace')
? marke
: `${seitenname} · ${marke}`;
/* Das Zeichen: derselbe Stempel, anderer Name. Ihn aus der
vorhandenen Adresse zu ersetzen statt ihn neu zu bauen haelt
die Versionsnummer daran -- sonst laedt der Browser ab hier ein
Bild ohne Stempel und behaelt es ein Jahr. */
for (const zeichen of document.querySelectorAll(
'link[rel="icon"], link[rel="apple-touch-icon"]')) {
const alt = zeichen.getAttribute('href') || '';
if (alt.includes('/workspace-')) {
zeichen.setAttribute('href', alt.replace('/workspace-', '/crew-'));
}
}
}
/* Das eigene Bild, wenn es eines gibt -- sonst der Anfangsbuchstabe.
@@ -134,7 +170,9 @@
k.type = 'button';
k.id = 'teilen';
k.className = 'teilen';
k.title = 'Adresse des Workspace weitergeben';
/* Ohne den Namen des Workspace: Auf der zweiten Adresse heisst der
Bereich anders, und "Adresse dieser Seite" stimmt ueberall. */
k.title = 'Adresse dieser Seite weitergeben';
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('class', 'teilen__zeichen');
@@ -161,9 +199,14 @@
laeuft = true;
try {
if (kannTeilen) {
/* Der Name kommt aus derselben Quelle wie die Kopfleiste.
Steht dort nichts, bleibt es beim gewohnten Namen. */
const wie = document.querySelector('.kopfleiste .marke__text .zurueck');
const name = (wie?.textContent || '').replace(/ /g, ' ').trim()
|| 'Creator Workspace';
await navigator.share({
title: 'Creator Workspace',
text: 'Der Creator Workspace von DogFather Universe',
title: name,
text: `${name} · DogFather Universe`,
url: ZIEL,
});
} else {
+1 -1
View File
@@ -121,7 +121,7 @@
braucht. Die Zahlen darunter kann man sich ansehen; hier wartet
jemand.
ZWEI ANTWORTEN, und beide kommen beim Modi an. Eine Meldung, auf
ZWEI ANTWORTEN, und beide kommen bei ihm an. Eine Meldung, auf
die nichts folgt, sieht fuer ihn aus wie eine, die niemand gelesen
hat -- und beim dritten Mal meldet er nichts mehr.
===================================================================== */