Filipe: "wenn ich in den chat rein gehe und es neue kommentare gibt, will ich dass mein chat sich da öffnet wo die neuen nachrichten anfangen die ich noch nicht gesehen hab bitte und nicht immer ganz unten. sonst muss man immer hoch scrollen um die neuen zu lesen und das ist scheisse. perfektionier das bei allen rollen." DIE FUNKTION GAB ES SEIT DEM 09.09.2026 -- eine Linie „Ab hier neu" und einen Sprung darauf. Sie hat trotzdem nicht funktioniert, und zwar aus DREI Gruenden, die sich gegenseitig verdeckt haben. Gefunden hat sie keine Ueberlegung, sondern eine Messung in Pixeln: Wie weit ist die Linie vom oberen Rand entfernt? Ein negativer Wert heisst „darueber", also unsichtbar. 1. DER SPRUNG RECHNETE GEGEN DEN FALSCHEN PUNKT. `linie.offsetTop` ist der Abstand zum `offsetParent` -- und das ist nur dann der Verlauf, wenn dieser `position: relative` traegt. Tut er nicht. Gemessen auf 390 px landete die Linie 23 px OBERHALB des sichtbaren Bereichs: Man musste genau das tun, was Filipe nicht mehr tun wollte. Am Rechner stimmte es zufaellig, weil dort weniger dazwischenliegt -- deshalb ist es nie aufgefallen. Jetzt: Oberkante der Linie minus Oberkante des Verlaufs plus dessen Bildlaufposition. Das gilt immer, egal wer wessen offsetParent ist. 2. JEDES NACHLADEN LOESCHTE DIE LINIE. `gelesenBeimOeffnen` wurde bei JEDEM Aufruf gesetzt, auch beim sanften Nachladen. Sanft laedt der Verlauf staendig nach -- vor allem, wenn der Ereignisstrom sich verbindet. Die Seite laedt, zeichnet, meldet „gelesen bis hier", der Strom verbindet sich, laedt sanft nach -- und jetzt steht in `gelesen_bis` schon die letzte Nachricht. Keine Linie mehr, Sprung ans Ende. DAS IST DER FEHLER, DEN FILIPE GESEHEN HAT. Und er wuerfelte: Kommt die Verbindung vor dem ersten Zeichnen, passiert nichts; danach ist die Linie weg. Ueber sechs Rollen gemessen waren mal drei rot, mal zwei, mal andere -- bei unveraendertem Code. 3. UND EIN EINZIGER SPRUNG REICHT NICHT. Zwischen Sprung und fertigem Bild waechst die Hoehe noch: Schriften kommen an und setzen den Text um, Bilder melden ihre Groesse. Jetzt wird nachgezogen -- nach den Schriften, nach jedem Bild, nach zwei Bildwiederholungen -- und die Stelle haelt, bis der Mensch selbst scrollt. „Ich habe dich an die neue Stelle gesetzt" ist eine Zusage; sie beim naechsten Nachladen zu brechen waere schlimmer, als sie nie gegeben zu haben. GEMESSEN -- server/pruef-chat-neu-stelle.mjs (neu), 63 Pruefungen, 0 Fehler, zweimal hintereinander mit demselben Ergebnis: Sechs Rollen in beiden Haeusern (DogFather, rechte Hand, linke Hand, Modi auf crew.; Manager und Creator auf workspace.), je auf Handy (390 px) und Rechner (1280 px). Je Blick: Steht die Linie im Verlauf? Ist sie zu SEHEN? Steht Zusammenhang darueber? Und ist der Verlauf NICHT am Ende? Ergebnis: 115-118 px unter dem oberen Rand am Handy, 150-153 px am Rechner -- darueber jeweils die letzte alte Nachricht. Dazu drei Gegenproben: Ohne Ungelesenes gibt es keine Linie und der Verlauf steht am Ende (sonst laendete man grundlos mitten im Verlauf); und die Messung erkennt „nicht sichtbar" auch wirklich (-1403 px an einem absichtlich nach unten gescrollten Verlauf) -- sonst waere jede gruene Zeile darueber wertlos. DIE PRUEFUNG SELBST HAT ZWEIMAL DAS FALSCHE GEMESSEN, bevor sie das Richtige maass, und beides steht als Begruendung darin: Sie schickte `/gelesen` ohne `bis` (die Route verlangt eine Nummer und lehnt sonst ab -- der Lesestand blieb null, die Linie entstand nie), und sie benutzte einen Raum je Rolle fuer zwei Blicke, was einen Wettlauf mit der „gelesen"-Meldung erzeugte. Jetzt bekommt jeder Blick seinen eigenen Raum: mehr Aufbau, dafuer immer dasselbe Ergebnis. pruef-chat 63/0, pruef-chat-optik 62/0, pruef-chat-kanaele 81/0, pruef-treffchat 110/0, pruef-chat-neu 36/0, pruef-pin-fuer-mich 37/0, pruef-erwaehnung 129/0, pruef-gifs 17/0. Co-Authored-By: Claude Opus 5 <[email protected]>
194 lines
8.6 KiB
HTML
194 lines
8.6 KiB
HTML
<!doctype html>
|
||
<html lang="de">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||
<title>Content-Ideen · Spicy & Dogi</title>
|
||
<meta name="robots" content="noindex, nofollow" />
|
||
<link rel="manifest" href="/workspace/app.webmanifest" />
|
||
<!-- Die Farbe der Fensterleiste, wenn der Workspace als App laeuft.
|
||
Stand auf #0674b9 (kraeftiges Blau) und stach damit als einziger
|
||
heller Balken ueber einer durchweg dunklen Seite. Jetzt derselbe
|
||
Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite
|
||
eine Flaeche sind statt zweier. -->
|
||
<meta name="theme-color" content="#06090f" />
|
||
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202609251440" />
|
||
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609251440" />
|
||
<link rel="stylesheet" href="assets/css/gate.css?v=202609251440" />
|
||
<link rel="stylesheet" href="assets/css/start.css?v=202609251440" />
|
||
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609251440" />
|
||
<link rel="stylesheet" href="assets/css/content.css?v=202609251440" />
|
||
<link rel="stylesheet" href="assets/css/module.css?v=202609251440" />
|
||
<!-- haus.css MUSS die letzte Stilvorlage sein (10.09.2026).
|
||
Auf der Agenturadresse ist sie leer -- das Haus hier IST der
|
||
Grundzustand. Auf der Adresse von Team Dogi biegt der Server
|
||
genau diesen Dateinamen auf crew-haus.css um, und die Seite
|
||
kommt schon beim ERSTEN Abruf in Lila und Babyblau an --
|
||
ohne Umfaerben im Browser, ohne Flackern. -->
|
||
<link rel="stylesheet" href="assets/css/haus.css?v=202609251440" />
|
||
</head>
|
||
|
||
<body class="start">
|
||
|
||
<!-- Der Schleier ueber der Buehne (Casper und HasiDog in den unteren
|
||
Ecken, siehe start.css). Ein eigenes Element statt eines dritten
|
||
Pseudo-Elements -- body hat nur ::before und ::after. -->
|
||
<div class="schleier" aria-hidden="true"></div>
|
||
|
||
<header class="kopfleiste">
|
||
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
|
||
<svg class="zurueck-knopf__pfeil" viewBox="0 0 24 24" aria-hidden="true">
|
||
<path d="M14.5 5.5 8 12l6.5 6.5" />
|
||
</svg>
|
||
<span class="zurueck-knopf__text">Zurück</span>
|
||
</button>
|
||
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator Workspace</a> · Content</span></p>
|
||
<div class="kopfleiste__rechts">
|
||
<span class="wer" id="wer">…</span>
|
||
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="inhalt inhalt--breit">
|
||
|
||
<section class="kopf-zeile">
|
||
<div>
|
||
<p class="marke">Betreuung</p>
|
||
<h1 class="titel">Content-Ideen</h1>
|
||
<p class="unterzeile" id="unterzeile">
|
||
Von der Idee bis zum Upload – eine Strecke, kein Terminkalender.
|
||
</p>
|
||
</div>
|
||
<button type="button" class="knopf knopf--klein" id="neu-oeffnen">Video anlegen</button>
|
||
</section>
|
||
|
||
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
|
||
|
||
<!-- Kennzahlen. Bewusst wenige und jede mit einer Handlung dahinter –
|
||
eine Zahl ohne Vergleich ist eine Eitelkeitszahl. -->
|
||
<!-- Die Kennzahlen-Reihe stand hier bis zum 01.09.2026 ("diese Kisten
|
||
sind jetzt ueberall zu viel, die sollen weg"). Die Strecke darunter
|
||
zeigt dieselben Zahlen an jeder Spalte. -->
|
||
|
||
<!-- Säulen-Balance: gestapelter Balken, 90 Tage, nur Veröffentlichtes. -->
|
||
<section class="balance" id="balance" hidden>
|
||
<div class="klapp-kopf">
|
||
<p class="feldschild">Womit der Kanal gefüllt wird <span class="leise" id="balance-zeit"></span></p>
|
||
<button type="button" class="knopf-still" id="saeulen-oeffnen">Säulen verwalten</button>
|
||
</div>
|
||
<div class="balance__balken" id="balance-balken" role="img" aria-label="Verteilung auf die Content-Säulen"></div>
|
||
<ul class="legende" id="balance-legende"></ul>
|
||
<p class="balance__hinweis" id="balance-hinweis"></p>
|
||
</section>
|
||
|
||
<!-- Säulen verwalten. Zugeklappt, weil man das selten anfasst. -->
|
||
<section class="saeulen-kasten" id="saeulen-kasten" hidden>
|
||
<div class="klapp-kopf">
|
||
<p class="feldschild">Content-Säulen</p>
|
||
<button type="button" class="knopf-still" id="saeulen-zu">Schließen</button>
|
||
</div>
|
||
<p class="block__frage">
|
||
Drei bis fünf Themen, aus denen der Kanal besteht. Als Richtwert gilt
|
||
<strong>70 % Wert</strong> (Unterhaltung, Hilfe), <strong>20 % Community</strong>,
|
||
<strong>10 % Eigenwerbung</strong>. Eine Säule wird erst brauchbar, wenn Formate an ihr hängen.
|
||
</p>
|
||
<div id="saeulen-liste"></div>
|
||
<form class="saeule-neu" id="saeule-neu">
|
||
<div class="feld feld--saeule-creator" id="feld-saeule-creator" hidden>
|
||
<label class="feld-schild" for="s-creator">Für</label>
|
||
<select id="s-creator"></select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="s-name">Name der Säule</label>
|
||
<input id="s-name" maxlength="40" placeholder="z. B. Tutorials" required />
|
||
</div>
|
||
<div class="feld feld--schmal">
|
||
<label class="feld-schild" for="s-ziel">Ziel-Anteil %</label>
|
||
<input id="s-ziel" type="number" min="0" max="100" step="5" placeholder="z. B. 70" />
|
||
</div>
|
||
<button type="submit" class="knopf knopf--klein">Hinzufügen</button>
|
||
</form>
|
||
</section>
|
||
|
||
<!-- Formular für ein neues Video -->
|
||
<form class="neu" id="neu" hidden>
|
||
<div class="neu__raster">
|
||
<div class="feld feld--breit">
|
||
<label class="feld-schild" for="f-titel">Worum geht es?</label>
|
||
<input id="f-titel" name="titel" maxlength="160" required
|
||
placeholder="z. B. „3 Fehler beim ersten LIVE“" />
|
||
</div>
|
||
<div class="feld feld--breit">
|
||
<label class="feld-schild" for="f-hook">
|
||
Hook <span class="leise">– die ersten Sekunden, sie entscheiden über alles</span>
|
||
</label>
|
||
<input id="f-hook" name="hook" maxlength="300"
|
||
placeholder="z. B. „Ich hab 4 Monate gebraucht, um das zu kapieren.“" />
|
||
</div>
|
||
<div class="feld" id="feld-creator" hidden>
|
||
<label class="feld-schild" for="f-creator">Creator</label>
|
||
<select id="f-creator"></select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="f-art">Stufe</label>
|
||
<select id="f-art"></select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="f-saeule">Säule</label>
|
||
<select id="f-saeule"></select>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="f-format">Format</label>
|
||
<input id="f-format" maxlength="60" list="formate" placeholder="z. B. Tutorial" />
|
||
<datalist id="formate">
|
||
<option value="Talking Head"></option>
|
||
<option value="Tutorial"></option>
|
||
<option value="Story"></option>
|
||
<option value="LIVE-Ausschnitt"></option>
|
||
<option value="Vorher/Nachher"></option>
|
||
<option value="Reaktion"></option>
|
||
<option value="Behind the Scenes"></option>
|
||
</datalist>
|
||
</div>
|
||
<div class="feld">
|
||
<label class="feld-schild" for="f-geplant">Soll raus am</label>
|
||
<input id="f-geplant" type="date" />
|
||
</div>
|
||
<div class="feld feld--breit">
|
||
<label class="feld-schild" for="f-text">Ablauf, Notizen (optional)</label>
|
||
<textarea id="f-text" rows="3" maxlength="6000"></textarea>
|
||
</div>
|
||
</div>
|
||
<p class="fehler" id="neu-fehler" role="alert" aria-live="polite"></p>
|
||
<div class="neu__knoepfe">
|
||
<button type="submit" class="knopf knopf--klein" id="neu-speichern">Anlegen</button>
|
||
<button type="button" class="abmelden" id="neu-abbrechen">Abbrechen</button>
|
||
</div>
|
||
</form>
|
||
|
||
<div class="filterzeile" id="filterzeile"></div>
|
||
|
||
<!-- Die Strecke. Fünf Spalten, auf dem Handy untereinander. -->
|
||
<!-- Fertige Ideen zum Uebernehmen. Steht VOR der Strecke: Wer noch
|
||
nichts hat, soll nicht erst an leeren Spalten vorbeiscrollen. -->
|
||
<div id="vorlagen" hidden></div>
|
||
|
||
<div class="strecke" id="strecke" aria-busy="true">
|
||
<p class="leise">Wird geladen …</p>
|
||
</div>
|
||
|
||
</main>
|
||
|
||
<script src="assets/js/meldung.js?v=202609251440" defer></script>
|
||
<script src="assets/js/nachfrage.js?v=202609251440" defer></script>
|
||
|
||
<script src="assets/js/wahl.js?v=202609251440" defer></script>
|
||
<script src="assets/js/bereiche.js?v=202609251440" defer></script>
|
||
<script src="assets/js/installieren.js?v=202609251440" defer></script>
|
||
<script src="assets/js/kopf.js?v=202609251440" defer></script>
|
||
<script src="assets/js/glocke.js?v=202609251440" defer></script>
|
||
<script src="assets/js/checkliste.js?v=202609251440" defer></script>
|
||
<script src="assets/js/content.js?v=202609251440" defer></script>
|
||
</body>
|
||
</html>
|