Files
dogfather-universe/workspace/bereich.html
T
DogFatherGitandClaude Opus 5 150555bc33 Der Notizblock -- und eine Pruefung, die zwoelf Kacheln nie angesehen hat
Filipe: „fuer die modis, rechte und linke hand und dogfather eine
kachel hinzufuegst, sie soll: Notizen, heissen. ich will dass du das
auch wie ein notizblock erstellst. ich will dass es uebelst geil und
einzigartig ist."

=================================================================
TEIL 1: DIE FARBE -- UND WAS DABEI AUFFIEL
=================================================================

Fuer die neue Kachel braucht es einen Ton. Beim Suchen fiel auf, dass
tools/kachelton-entzerren.mjs zwoelf der 45 Farben fuer FREI hielt.

Sie sind es nicht. bereicheFuer() gibt fuer die fuenf Rollen des
Agenturhauses null zurueck -- das heisst „nimm die Liste aus dem
Browser", und die steht in workspace/assets/js/bereiche.js. Dort
stehen die Toene 1 bis 22 und 44: Dashboard, Zahlen, Team-Lage,
Scout-Pipeline. Kacheln, die jeden Tag jemand ansieht.

pruef-kachelfarben hatte denselben blinden Fleck. Sie meldete seit
Wochen „33 benutzte Toene" und war gruen. Was sie dadurch NICHT sah:

  * Der Farblauf von gestern Nacht hat zwoelf dieser Kacheln
    verschoben und drei davon unter die Buntheitsgrenze gedrueckt.
    Gruen geblieben.
  * Ton 7, 16 und 22 lagen SEIT JEHER unter der Grenze (0,112 / 0,116
    / 0,068). Nie gemeldet.

Das ist die Sorte gruener Haken, vor der die Hausregel warnt: Er sagt
nur, dass die Bedingung erfuellt war -- nicht, dass sie das Richtige
angesehen hat.

BEHOBEN, und zwar an der Wurzel: Die REGELN (Kontrast, Buntheit)
gelten jetzt fuer jeden Ton, der irgendwo an einer Kachel steht --
gelesen aus denselben fuenf Dateien, die auch pruef-kachel-universum
liest. Dazu die Namen der Kacheln, damit „Ton 1 traegt Dashboard"
ueberhaupt pruefbar ist.

DIE PALETTE WURDE NEU GERECHNET, mit dem dritten Verfahren an einem
Tag -- die ersten zwei stehen als Fehler im Kopf des Werkzeugs:

  1. Alle 45 neu verteilt. Lief ueber zwei ausdrueckliche Wuensche
     hinweg (#ff1a1a, #a8d8ff).
  2. Nur die Kollisionen, aber immer nur EINEN der beiden bewegt.
     Ergebnis: Ton 1 sprang vom Tuerkis ins Altrosa, 0,197 weit.
  3. BEIDE duerfen sich bewegen, und zwar beide nur ein bisschen.
     Zwei Toene, die 0,02 auseinanderstehen und 0,09 brauchen, teilen
     sich das -- jeder rueckt 0,045, und beide bleiben, was sie waren.

  kleinster Abstand   0,0154  ->  0,0905
  zu blass                 4  ->  0
  sichtbar veraendert           7 Kacheln (ueber 0,05)
  kaum zu sehen                28 (13 zwischen 0,02 und 0,05, 15 darunter)

EINE AUSNAHME MIT ZAHL, keine mit Achselzucken: Ton 1 (Dashboard)
bleibt acht Tausendstel unter der Buntheitsgrenze. Gemessen ueber ALLE
16,7 Millionen sRGB-Farben ist die naechste, die alle Regeln haelt,
#7a75c8 -- ein Blauviolett, 0,113 entfernt. Tuerkis erreicht in sRGB
schlicht keine hoehere Buntheit, und das schmale Band teilen sich
schon sieben Toene. Eine Kachel, die ihre Farbfamilie behaelt, ist die
bessere Antwort auf „richtig geil und speziell" als eine, die acht
Tausendstel bunter ist und niemand wiedererkennt. blassBis sagt jetzt
bei jeder Ausnahme, WIE WEIT sie reicht -- vorher hiess blassErlaubt
schlicht „hier wird weggesehen".

DIE NEUE FARBE IST GRUEN UND WOLLTE BERNSTEIN SEIN. Gesucht war die
Farbe von Papier. Gemessen gibt es sie nicht mehr: Der beste Bernstein
im ganzen Farbraum haelt 0,0799 Abstand -- unter der Hausgrenze. Und
Platz schaffen hilft nicht: Setzt man ihn fest, muss ein warmer Ton
das Band verlassen (Ton 45 waere 0,212 weit ins Magenta gewandert).
Die groesste wirklich freie Luecke liegt im Gruen, bei 0,0917. Ein
linierter Block in Gruen ist Papier, seit es Papier gibt.

=================================================================
TEIL 2: DER BLOCK
=================================================================

DREI ENTSCHEIDUNGEN, AUS DENEN DER REST FOLGT:

1. ES GIBT KEINEN SPEICHERN-KNOPF. Nirgends. Wer einen Block
   aufschlaegt und lostippt, drueckt hinterher nicht auf „sichern";
   er klappt ihn zu. Gesichert wird 800 ms nach dem letzten
   Tastendruck. Geht das nicht, bleibt der Text im Browser liegen und
   wird nachgereicht -- und der Fuss sagt ehrlich „noch nicht
   gesichert", statt einen Verlust zu melden, den man gerade nicht
   verhindern kann.

2. DAS BLATT IST EIN SCHREIBFELD MIT EINER DECKSCHICHT. Das Feld
   traegt Text und Cursor und ist unsichtbar; darueber zeichnet eine
   zweite Schicht denselben Text noch einmal -- mit Kaestchen,
   Ueberschriften, Strichen und Links.

   DARAUS FOLGT EINE EISERNE REGEL, und sie steht dreimal im Code:
   KEINE Auszeichnung darf die BREITE eines Zeichens aendern. Kein
   Fettdruck, keine andere Groesse, keine Sperrung. Erlaubt sind nur
   Farbe, Flaeche, Rahmen und Durchstreichen. Ein einziges
   font-weight: 700 verschoebe den Umbruch, und ab der zweiten Zeile
   stuende der sichtbare Text neben dem Cursor.

   pruef-notizen misst das am echten Umbruch: eine Probe mit allen
   Auszeichnungen und einer Zeile, die umbrechen MUSS. Sind beide
   Schichten verschieden hoch, sitzt der Umbruch woanders. Mit
   Gegenprobe -- Fettdruck auf der Deckschicht bricht die Deckung um
   genau eine Zeile (30 px), und die Zeile wird rot.

3. DIE TASTATUR FUEHRT DIE LISTE FORT, NICHT EINE LEISTE. Ein
   Spiegelstrich und Enter macht den naechsten Punkt, ein leeres
   Kaestchen und Enter das naechste Kaestchen -- und ein GESETZTER
   Haken wird dabei nicht mitgenommen, die naechste Aufgabe ist ja
   noch nicht erledigt. Zweimal Enter beendet die Liste. Ein Klick
   aufs Kaestchen hakt ab. Es gibt keine Werkzeugleiste, weil man beim
   Schreiben nie den Stift wechselt.

UND: NIEMAND SIEHT DIE NOTIZEN EINES ANDEREN. Auch DogFather nicht.
Es gibt in workspace-notizen.js keinen siehtAlles()-Zweig, keinen
Umschalter, keine fremde Liste -- jede Abfrage hat person_id = ? fest
eingebaut. Die Kachel steht deshalb in „Fuer dich" und nicht in
„Taeglich": Die Gruppe sagt die wichtigste Eigenschaft, bevor man sie
anfasst.

NUR AUF DER TEAM-ADRESSE. Auf der Agenturadresse ist die Seite ein
404 -- auch fuer DogFather. Das ist dieselbe Trennung wie bei Chat,
Kalender und Aufgaben, und sie steht an zwei Stellen: in
GEHOERT_ZU_ADRESSE (die Datei) und in der Schnittstelle (die Daten).
Die Seite ist nur HTML; die Daten sind die Sache.

Dazu: sechs Papierfarben, Anheften, Suche mit Hervorhebung im Text,
Papierkorb mit dreissig Tagen und einem Eintrag in der
Aufbewahrungsliste (ohne den waere die Frist ein Satz in einem
Kommentar -- genau das ist dem Support am 24.09. passiert).

=================================================================
EIN FUND BEIM BAUEN, DER ALLEN GEHOERT
=================================================================

DELETE /workspace/api/notizen/:id gab es schon -- in
workspace-aufgaben.js, fuer die Notizen AN einer Aufgabe. Weil jener
Router frueher eingehaengt ist, hat er jeden Loeschversuch des Blocks
abgefangen und mit 404 beantwortet.

Von aussen sah das aus wie ein Fehler im neuen Modul: Anlegen ging,
Aendern ging, Loeschen nicht. Man sucht dann im eigenen Code, und dort
ist nichts. Express meldet so etwas nicht -- es nimmt die erste Route,
die passt, und schweigt ueber die zweite.

Der Block liegt jetzt unter /workspace/api/notizblock. Und
pruef-notizen geht seitdem den Routenbaum von express durch und meldet
jedes Paar aus Methode und Pfad, das zweimal vergeben ist. Gemessen:
307 Wege, keine Dublette. Die Pruefung gilt fuers ganze Haus, auch
wenn sie in dieser Datei steht -- hier ist sie gefunden worden.

Nebenbei berichtigt: pruef-crew-adresse verlangte von jedem Eintrag
der Haustafel HTTP 200 mit Inhalt. Das stimmte, solange dort nur
oeffentliche Dateien standen. notizen.html ist die erste Seite hinter
der Anmeldung -- sie antwortet mit 302, und das ist richtig. Gefragt
wird jetzt, was die Tafel wirklich meint: GIBT es das hier.

GEMESSEN, alles nach den Aenderungen:

  pruef-notizen             76 Punkte, 0 Fehler (neu)
  pruef-kachelfarben        31 Punkte, 0 Fehler (vorher 26)
  pruef-kachel-universum    13 Punkte, 0 Fehler
  pruef-crew-adresse       157 Punkte, 0 Fehler
  pruef-buehne             230 Punkte, 0 Fehler -- notizen.html neu in
                           der Liste, schlechtester Kontrast 6,73:1,
                           also 50 % ueber der Grenze
  pruef-rechtetafel, -haus-seiten, -struktur, -css-klassen,
  -jeder-hat-eine-seite, -workspace-seiten, -kachelraster,
  -rueckmeldung            alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-26 12:42:59 +02:00

323 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Bereich · 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=202609261240" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202609261240" />
<link rel="stylesheet" href="assets/css/gate.css?v=202609261240" />
<link rel="stylesheet" href="assets/css/start.css?v=202609261240" />
<link rel="stylesheet" href="assets/css/aufgaben.css?v=202609261240" />
<link rel="stylesheet" href="assets/css/bereich.css?v=202609261240" />
<!-- Wegen des Blocks „Willst du dazugehoeren?" auf dem Brett
„Mitmachen". Eine eigene Kopie der Regel hier waere die zweite
Stelle, an der dieselbe Sache anders aussieht. -->
<link rel="stylesheet" href="assets/css/bewerbung.css?v=202609261240" />
<link rel="stylesheet" href="assets/css/module.css?v=202609261240" />
<!-- 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=202609261240" />
</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>
<!-- Der innere span.marke__text fehlte hier als einziger Seite. Damit
griffen weder die Überlauf-Kürzung noch der Rang im Schriftzug --
aufgefallen erst, als die Seitenprüfung die Marke auf allen
dreizehn Seiten nachgesehen hat. -->
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Creator&nbsp;Workspace</a> ·
<span id="marke-bereich">…</span></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>
<!-- LEER, UND DAS IST ABSICHT (20.09.2026). Hier stand fest
"Betreuung" -- und weil sechs Bretter keine eigene
Oberzeile haben, stand das Wort ueber den Brettern eines
Modi, der niemanden betreut. Der Server schickt jetzt die
Gruppe der Kachel mit, ueber die man hergekommen ist. -->
<p class="marke" id="ober"></p>
<h1 class="titel" id="titel">…</h1>
<p class="unterzeile" id="unterzeile"></p>
<!-- WER ENTSCHEIDET (21.09.2026).
Filipe: "immer wenn es um was geht was ich machen soll ...
dass ich immer am ende entscheide ob ich was mache oder
nicht. ich kann immer annehmen oder ablehnen."
STEHT NUR AUF BRETTERN, FUER DIE ES VORSCHLAEGE GIBT -- der
Server entscheidet das, abgeleitet aus dem Vorschlagskatalog.
Auf einem Brett fuer Termine oder Dateien waere der Satz
sinnlos, und ein Hinweis, der ueberall steht, wird nirgends
gelesen.
`hidden` von Anfang an: Sonst blitzt beim Laden eine leere
Zeile auf und die Ueberschrift springt. -->
<p class="brett-entscheidung" id="brett-entscheidung" hidden></p>
</div>
<button type="button" class="knopf knopf--klein" id="neu-oeffnen">Neuer Eintrag</button>
</section>
<form class="neu" id="neu" hidden>
<!-- STARTHILFE (18.09.2026). Ein leeres Feld ist der haeufigste
Grund, warum ein Brett still bleibt, obwohl viele mitlesen.
Die Zeile verschwindet, sobald jemand selbst tippt -- Hilfe,
die stehen bleibt, wenn man sie nicht mehr braucht, ist im Weg. -->
<div class="starthilfe" id="starthilfe" hidden>
<p class="starthilfe__wort">Kein Anfang? Nimm eines davon und schreib es um:</p>
<div class="starthilfe__reihe" id="starthilfe-reihe"></div>
</div>
<div class="neu__raster">
<div>
<label class="feld-schild" for="f-art">Art</label>
<select id="f-art"></select>
</div>
<div>
<label class="feld-schild" for="f-datum" id="schild-datum">Datum</label>
<input id="f-datum" type="date" />
<!-- WAS DAS DATUM BEWIRKT (17.09.2026). Das Feld ist mit heute
vorbelegt und hiess bisher nur "Datum" -- dass ein Tag in der
Zukunft den Zettel in den Kalender bringt, konnte niemand
wissen. Der Satz aendert sich mit der Eingabe: Ein fester
Hinweis beantwortet die Frage nicht, die man gerade hat. -->
<p class="feld-hinweis" id="hinweis-datum" aria-live="polite"></p>
</div>
<!-- DIE UHRZEIT (17.09.2026). Nur dort sichtbar, wo Termine
stehen. Optional: Viele Termine haben keine Uhrzeit ("diese
Woche", "im Oktober"), und ein Pflichtfeld haette dafuer eine
erfundene erzwungen. Ohne sie zaehlt der Countdown in Tagen. -->
<div id="feld-uhrzeit" hidden>
<label class="feld-schild" for="f-uhrzeit">Uhrzeit</label>
<input id="f-uhrzeit" type="time" />
<p class="feld-hinweis">Wenn du sie weißt. Dann zählt der Countdown in Stunden.</p>
</div>
<!-- Nur bei Agentur-Events: das Ende des Zeitraums. Der Beginn ist
das Feld darueber -- ein zweites Datumsfeld daneben liest sich
als Spanne, ein Feld "Zeitraum" mit Text darin nicht. -->
<div id="feld-ende" hidden>
<label class="feld-schild" for="f-ende">Bis</label>
<input id="f-ende" type="date" />
</div>
<!-- ZU WELCHEM ACCOUNT GEHOERT DAS? (20.09.2026)
Filipe: "und wenn man was hinzufuegt soll man auch den
account auswaehlen koennen."
NUR AUF DEN HIGHLIGHTS, und nur dort auch noetig: Bei einem
TikTok-Link leitet der Server den Kanal aus dem Handle ab
(kanalVonHandle) -- das ist genauer als jede Auswahl, weil
niemand sich vertippen kann. Ein Bild, ein Moment oder eine
Fanart hat aber keinen Link, und bisher landete so etwas
unweigerlich in "Ohne Account".
"Noch offen" steht an erster Stelle und ist die Vorgabe. Ein
Pflichtfeld haette hier einen falschen Kanal erzwungen, und
ein falscher Eintrag ist schlechter als ein leerer -- genau
das steht so schon an KANAELE im Server. -->
<div id="feld-kanal" hidden>
<label class="feld-schild" for="f-kanal">Zu welchem Account?</label>
<select id="f-kanal"></select>
<p class="feld-hinweis" id="hinweis-kanal"></p>
</div>
<!-- Was DogFather dafuer tun muesste. Nur in Bereichen, die das
Feld kennen (siehe BEREICHE.angebote) -- sonst bleibt es
verborgen und wird auch nicht mitgeschickt. -->
<div id="feld-einsatz" hidden>
<label class="feld-schild" for="f-einsatz" id="einsatz-schild">Einsatz</label>
<input id="f-einsatz" type="text" maxlength="300"
placeholder="z. B. Termin ansagen und den Gast einladen" />
</div>
<!-- FÜRS TEAM ODER NUR AN DOGFATHER (10.09.2026, Kapitel 5).
Steht nur dort, wo der Bereich es vorsieht -- der Server sagt
das über `einstellung.vertraulich`, nicht diese Datei.
Es ist ein Schalter mit zwei Zuständen und keine Auswahlliste:
Es gibt genau zwei Antworten, und eine davon ist der
Normalfall. -->
<div id="feld-vertraulich" hidden>
<label class="feld-schild" for="f-vertraulich">Wer darf das lesen?</label>
<label class="vertraulich-zeile">
<input type="checkbox" id="f-vertraulich" />
<span>
<strong>Nur DogFather</strong>
<em>Sonst liest es das ganze Team – auch die rechte Hand.</em>
</span>
</label>
</div>
<div id="feld-dringlich" hidden>
<label class="feld-schild" for="f-dringlich" id="dringlich-schild">Dringlichkeit</label>
<select id="f-dringlich">
<option value="hoch">hoch</option>
<option value="mittel" selected>mittel</option>
<option value="niedrig">niedrig</option>
</select>
</div>
<div id="feld-bewertung" hidden>
<label class="feld-schild" for="f-bewertung" id="bewertung-schild">Bewertung (1–5)</label>
<select id="f-bewertung">
<option value="">—</option>
<option value="1">1 – schwach</option>
<option value="2">2</option>
<option value="3">3 – solide</option>
<option value="4">4</option>
<option value="5">5 – stark</option>
</select>
</div>
<div id="feld-creator" hidden>
<label class="feld-schild" for="f-creator" id="schild-creator">Creator</label>
<select id="f-creator"><option value="">—</option></select>
<p class="feld-hinweis" id="hinweis-creator" hidden></p>
</div>
</div>
<div class="neu__zeile">
<label class="feld-schild" for="f-titel" id="schild-titel">Überschrift</label>
<input id="f-titel" maxlength="160" required />
</div>
<div class="neu__zeile">
<label class="feld-schild" for="f-text" id="schild-text">Text <span class="leise">(optional)</span></label>
<textarea id="f-text" rows="4" maxlength="6000"></textarea>
</div>
<!-- ==== Nur bei Agentur-Events ====================================
Zwei Felder, die den Unterschied zwischen einem Aufruf und einer
Aktion ausmachen, an der jemand teilnehmen kann: WAS ist zu tun
(und was springt dabei heraus) und WAS GILT dabei. Beides stand
bisher irgendwo im Fliesstext oder gar nicht -- und jede
Rueckfrage dazu kostet eine Nachricht. -->
<div class="neu__zeile" id="feld-aufgaben" hidden>
<label class="feld-schild" for="f-aufgaben">Aufgaben
<span class="leise">– womit sammelt man Punkte, was gibt es zu gewinnen</span></label>
<textarea id="f-aufgaben" rows="5" maxlength="6000"
placeholder="z. B.&#10;· 1 Punkt je Live-Stunde&#10;· 3 Punkte je neuem Abo&#10;· Platz 1 gewinnt …"></textarea>
</div>
<div class="neu__zeile" id="feld-regeln" hidden>
<label class="feld-schild" for="f-regeln">Regeln
<span class="leise">– was zählt, was nicht, bis wann</span></label>
<textarea id="f-regeln" rows="5" maxlength="6000"
placeholder="z. B.&#10;· Nur Streams auf dem eigenen Konto&#10;· Punkte zählen bis 23:59 am letzten Tag"></textarea>
</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">Eintragen</button>
<button type="button" class="abmelden" id="neu-abbrechen">Abbrechen</button>
</div>
</form>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- DER COUNTDOWN STEHT GANZ OBEN, noch vor den Filtern.
Zuerst stand er UNTER dem Startkatalog -- und der schob die
Antwort auf "wann ist der naechste Stream" von 458 px auf
1488 px, also aus dem ersten Handybildschirm heraus.
Gefunden hat das nicht das Auge, sondern pruef-countdown:
Das Abnahmekriterium aus Stufe 2 wurde rot, als Stufe 5
dazukam.
Die Regel dahinter: Ein WERKZEUG (fuer das Team) draengt
nie eine ANTWORT (fuer alle) nach unten. -->
<section id="countdown" class="countdown" hidden></section>
<!-- DER NAECHSTE SCHRITT. Was hier steht, entscheidet der Server --
er kennt die Rolle, und Rollennamen stehen in keiner Datei, die
jeder herunterladen kann. Derzeit genau eine Stelle: der Weg zur
Anfrage auf dem Brett "Mitmachen".
UEBER DEM FILTER, weil es eine ANTWORT ist und kein Werkzeug --
dieselbe Regel, die den Countdown nach oben gebracht hat. -->
<section id="weiter" class="bw-tor" hidden></section>
<div class="filter" id="filter"></div>
<!-- Fertige Punkte zum Uebernehmen -- nur in Bereichen, fuer die es
welche gibt (derzeit LIVE-Analyse). -->
<!-- Unterweisungen mit beidseitiger Bestaetigung. Nur im Bereich
"Schutz & Regeln" -- dort gehoeren Richtlinien hin. -->
<div id="schulung" hidden></div>
<div id="vorlagen" hidden></div>
<!-- DER COUNTDOWN. Nur bei "Was ansteht": Die einzige Frage, die
ein Zuschauer dort wirklich hat, ist WANN -- und sie gehoert
gross beantwortet, nicht in Zeile vier. -->
<!-- DER STARTKATALOG (17.09.2026). Nur fuer das Team und nur,
solange es etwas zu holen gibt. Ein Brett, das nur aus
Filterknoepfen und "Noch kein Eintrag" besteht, sieht nicht
neu aus, sondern aufgegeben. -->
<!-- EIN VIDEO EINLESEN (17.09.2026), Stufe A des Video-Plans.
Nur bei den Highlights und nur fuer das Team. Link einfuegen,
den Rest macht der Server: Titel, Coverbild, Kanal. -->
<section id="videoholen" class="videoholen" hidden>
<form id="video-form" class="videoholen__form">
<label class="feld-schild" for="video-url">Video-Link einfügen</label>
<div class="videoholen__zeile">
<input id="video-url" type="url" inputmode="url"
placeholder="https://www.tiktok.com/@dogfather0804/video/…" />
<button type="submit" class="knopf knopf--klein" id="video-holen">Holen</button>
</div>
<!-- WOHIN ES GELEGT WIRD (22.09.2026). Filipe: "ich will das wenn
man da video holt das man auch aussuchen kann in welcher
account es unten angezeigt werden soll."
Vorgabe bleibt "aus dem Link" -- das ist der haeufigste Fall
und soll keinen zusaetzlichen Handgriff kosten. -->
<div class="videoholen__wohin">
<label class="feld-schild" for="video-kanal">In welchen Account?</label>
<select id="video-kanal"></select>
</div>
<p class="feld-hinweis" id="video-hinweis">Titel und Coverbild kommen von selbst. Es zählen nur deine drei Kanäle.</p>
</form>
</section>
<section id="startkatalog" class="startkatalog" hidden></section>
<div id="liste" aria-busy="true"><p class="leise">Einträge werden geladen …</p></div>
</main>
<!-- TEXTFORM ZUERST (21.09.2026): Die Seite fragt beim Zeichnen nach
`window.Textform`. Kaeme sie spaeter, waere der erste Eintrag ohne
Gestaltung. Kein `defer`, damit sie wirklich vorher dasteht. -->
<script src="assets/js/textform.js?v=202609261240"></script>
<script src="assets/js/meldung.js?v=202609261240" defer></script>
<script src="assets/js/nachfrage.js?v=202609261240" defer></script>
<script src="assets/js/wahl.js?v=202609261240" defer></script>
<script src="assets/js/bereiche.js?v=202609261240" defer></script>
<script src="assets/js/installieren.js?v=202609261240" defer></script>
<script src="assets/js/kopf.js?v=202609261240" defer></script>
<script src="assets/js/glocke.js?v=202609261240" defer></script>
<script src="assets/js/checkliste.js?v=202609261240" defer></script>
<script src="assets/js/ampel.js?v=202609261240" defer></script>
<script src="assets/js/schulung.js?v=202609261240" defer></script>
<script src="assets/js/holen.js?v=202609261240" defer></script>
<script src="assets/js/bereich.js?v=202609261240" defer></script>
</body>
</html>