diff --git a/server/workspace-vorlagen.js b/server/workspace-vorlagen.js index ee2629cc..9ea04756 100644 --- a/server/workspace-vorlagen.js +++ b/server/workspace-vorlagen.js @@ -137,31 +137,43 @@ export const CONTENT_IDEEN = [ export const LIVE_PUNKTE = { vorbereitung: [ - { schluessel: "ton-geprueft", titel: "Ton geprüft", text: "Eine Minute aufnehmen und anhören. Ton ist der Grund Nummer eins, warum Leute wieder gehen." }, - { schluessel: "licht-sitzt", titel: "Licht sitzt", text: "Gesicht heller als der Hintergrund. Kein Fenster im Rücken." }, - { schluessel: "verbindung-getestet", titel: "Verbindung getestet", text: "Upload-Geschwindigkeit geprüft, Kabel statt WLAN wenn möglich." }, - { schluessel: "titel-und-thema-stehen", titel: "Titel und Thema stehen", text: "Wer den Titel liest, weiß, was ihn erwartet – und ob es für ihn ist." }, - { schluessel: "ablauf-grob-im-kopf", titel: "Ablauf grob im Kopf", text: "Drei Blöcke reichen. Ein Stream ohne roten Faden fühlt sich für Zuschauer wie Warten an." }, - { schluessel: "angekuendigt", titel: "Angekündigt", text: "Mindestens einmal vorher gesagt, dass es losgeht – Story, Post oder Nachricht." }, - { schluessel: "moderation-geklaert", titel: "Moderation geklärt", text: "Weiß jemand Bescheid, der eingreifen kann, wenn es im Chat kippt?" }, - { schluessel: "technik-ersatz-bereit", titel: "Technik-Ersatz bereit", text: "Was passiert, wenn der Stream abbricht? Handy als Notlösung bereitlegen." }, + { schluessel: "ton-geprueft", titel: "Ton geprüft", text: "Eine Minute aufnehmen und anhören. Ton ist der Grund Nummer eins, warum Leute wieder gehen.", stufe: "anfaenger" }, + { schluessel: "licht-sitzt", titel: "Licht sitzt", text: "Gesicht heller als der Hintergrund. Kein Fenster im Rücken.", stufe: "anfaenger" }, + { schluessel: "verbindung-getestet", titel: "Verbindung getestet", text: "Upload-Geschwindigkeit geprüft, Kabel statt WLAN wenn möglich.", stufe: "anfaenger" }, + { schluessel: "titel-und-thema-stehen", titel: "Titel und Thema stehen", text: "Wer den Titel liest, weiß, was ihn erwartet – und ob es für ihn ist.", stufe: "anfaenger" }, + { schluessel: "ablauf-grob-im-kopf", titel: "Ablauf grob im Kopf", text: "Drei Blöcke reichen. Ein Stream ohne roten Faden fühlt sich für Zuschauer wie Warten an.", stufe: "fort" }, + { schluessel: "angekuendigt", titel: "Angekündigt", text: "Mindestens einmal vorher gesagt, dass es losgeht – Story, Post oder Nachricht.", stufe: "fort" }, + { schluessel: "moderation-geklaert", titel: "Moderation geklärt", text: "Weiß jemand Bescheid, der eingreifen kann, wenn es im Chat kippt?", stufe: "fort" }, + { schluessel: "technik-ersatz-bereit", titel: "Technik-Ersatz bereit", text: "Was passiert, wenn der Stream abbricht? Handy als Notlösung bereitlegen.", stufe: "fort" }, + { schluessel: "upload-gemessen-bitrate-darunter", titel: "Upload gemessen, Bitrate darunter", text: "Vor der Sendung messen, nicht schaetzen. Video und Ton zusammen sollen hoechstens 70 bis 80 Prozent des gemessenen Uploads belegen -- der Rest ist der Puffer, der verworfene Bilder verhindert.", stufe: "profi" }, + { schluessel: "keyframe-alle-zwei-sekunden", titel: "Keyframe alle zwei Sekunden", text: "Der Abstand, in dem ein volles Bild geschickt wird. Zwei Sekunden ist keine Geschmacksfrage: Alles andere kann bei Zuschauern zu Puffern oder gar nicht erst zum Abspielen fuehren.", stufe: "profi" }, + { schluessel: "probelauf-privat-gestreamt", titel: "Probelauf privat gestreamt", text: "Nicht die Vorschau im Programm, sondern ein echter privater Stream. Erst der zeigt, was beim Zuschauer ankommt -- Ton, Bild, Verzoegerung, Verbindung.", stufe: "profi" }, + { schluessel: "die-ersten-dreissig-sekunden-stehen", titel: "Die ersten dreissig Sekunden stehen", text: "Wortwoertlich vorbereitet. In dieser halben Minute entscheidet sich, ob jemand bleibt, und genau dort improvisiert man am schlechtesten.", stufe: "profi" }, + { schluessel: "ausweichweg-laeuft-mit", titel: "Ausweichweg laeuft mit", text: "Zweites Geraet bereit und angemeldet, nicht nur daneben. Ein Ersatz, den man erst einrichten muss, ist im Moment des Ausfalls keiner.", stufe: "meister" }, + { schluessel: "ablauf-als-vorlage-nicht-als-zettel", titel: "Ablauf als Vorlage, nicht als Zettel", text: "Derselbe Aufbau jedes Mal, als Vorlage gespeichert. Was jedes Mal neu erfunden wird, wird jedes Mal anders gut.", stufe: "meister" }, + { schluessel: "ein-ziel-in-einer-zahl", titel: "Ein Ziel in einer Zahl", text: "Vorher festlegen, woran diese Sendung gemessen wird -- Verweildauer, Wiederkehrer, Kommentare. Ohne Zahl vorher ist die Auswertung danach eine Meinung.", stufe: "meister" }, ], mitschrift: [ - { schluessel: "guter-moment-aufheben", titel: "Guter Moment – aufheben", text: "Etwas ist gut gelaufen. Kurz notieren, woran es lag – daraus wird später ein Clip." }, - { schluessel: "hier-sind-leute-gegangen", titel: "Hier sind Leute gegangen", text: "Zeitpunkt merken. Später nachsehen, was in dem Moment passiert ist." }, - { schluessel: "frage-aus-dem-chat-die-wiederkommt", titel: "Frage aus dem Chat, die wiederkommt", text: "Wird oft gefragt? Dann gehört sie in ein eigenes Video." }, - { schluessel: "technik-hat-gehakt", titel: "Technik hat gehakt", text: "Ton weg, Bild eingefroren, Verzögerung – aufschreiben, solange man es noch weiß." }, - { schluessel: "unangenehme-situation-im-chat", titel: "Unangenehme Situation im Chat", text: "Was war es, wie ist es ausgegangen? Auch wenn es gut lief." }, - { schluessel: "neue-zuschauer-aufgetaucht", titel: "Neue Zuschauer aufgetaucht", text: "Woher kamen sie? Wurde jemand begrüßt oder ging es unter?" }, - { schluessel: "ich-wusste-nicht-weiter", titel: "Ich wusste nicht weiter", text: "Stelle merken, an der es gestockt hat. Dafür gibt es Hilfe." }, + { schluessel: "guter-moment-aufheben", titel: "Guter Moment – aufheben", text: "Etwas ist gut gelaufen. Kurz notieren, woran es lag – daraus wird später ein Clip.", stufe: "anfaenger" }, + { schluessel: "hier-sind-leute-gegangen", titel: "Hier sind Leute gegangen", text: "Zeitpunkt merken. Später nachsehen, was in dem Moment passiert ist.", stufe: "fort" }, + { schluessel: "frage-aus-dem-chat-die-wiederkommt", titel: "Frage aus dem Chat, die wiederkommt", text: "Wird oft gefragt? Dann gehört sie in ein eigenes Video.", stufe: "fort" }, + { schluessel: "technik-hat-gehakt", titel: "Technik hat gehakt", text: "Ton weg, Bild eingefroren, Verzögerung – aufschreiben, solange man es noch weiß.", stufe: "anfaenger" }, + { schluessel: "unangenehme-situation-im-chat", titel: "Unangenehme Situation im Chat", text: "Was war es, wie ist es ausgegangen? Auch wenn es gut lief.", stufe: "fort" }, + { schluessel: "neue-zuschauer-aufgetaucht", titel: "Neue Zuschauer aufgetaucht", text: "Woher kamen sie? Wurde jemand begrüßt oder ging es unter?", stufe: "fort" }, + { schluessel: "ich-wusste-nicht-weiter", titel: "Ich wusste nicht weiter", text: "Stelle merken, an der es gestockt hat. Dafür gibt es Hilfe.", stufe: "anfaenger" }, + { schluessel: "zeitstempel-statt-gefuehl", titel: "Zeitstempel statt Gefuehl", text: "Die Minute notieren, nicht 'irgendwann in der Mitte'. Nur mit der Minute findet man die Stelle in der Aufzeichnung wieder.", stufe: "profi" }, + { schluessel: "chatverlauf-gesichert", titel: "Chatverlauf gesichert", text: "Vor dem Schliessen speichern. Er ist die einzige Quelle dafuer, was wirklich gesagt wurde -- und bei einem Vorfall die einzige, die zaehlt.", stufe: "profi" }, ], auswertung: [ - { schluessel: "was-hat-diesmal-getragen", titel: "Was hat diesmal getragen?", text: "Ein Ding. Nicht drei. Das eine, das man wiederholen will." }, - { schluessel: "was-war-zaeh", titel: "Was war zäh?", text: "Ehrlich sein. Die zähen Stellen sind die, an denen man wächst." }, - { schluessel: "zahlen-im-vergleich", titel: "Zahlen im Vergleich", text: "Zuschauer, Verweildauer, Kommentare – gegen das letzte Mal, nicht gegen andere." }, - { schluessel: "clips-gesichert", titel: "Clips gesichert", text: "Die guten Momente rausgeschnitten und abgelegt, solange man sie noch findet." }, - { schluessel: "eine-sache-fuer-naechstes-mal", titel: "Eine Sache für nächstes Mal", text: "Genau eine. Wer sich fünf Dinge vornimmt, macht keins davon." }, - { schluessel: "braucht-besprechung", titel: "Braucht Besprechung", text: "Etwas, das man nicht allein lösen kann – geht an die Betreuung." }, + { schluessel: "was-hat-diesmal-getragen", titel: "Was hat diesmal getragen?", text: "Ein Ding. Nicht drei. Das eine, das man wiederholen will.", stufe: "anfaenger" }, + { schluessel: "was-war-zaeh", titel: "Was war zäh?", text: "Ehrlich sein. Die zähen Stellen sind die, an denen man wächst.", stufe: "anfaenger" }, + { schluessel: "zahlen-im-vergleich", titel: "Zahlen im Vergleich", text: "Zuschauer, Verweildauer, Kommentare – gegen das letzte Mal, nicht gegen andere.", stufe: "fort" }, + { schluessel: "clips-gesichert", titel: "Clips gesichert", text: "Die guten Momente rausgeschnitten und abgelegt, solange man sie noch findet.", stufe: "fort" }, + { schluessel: "eine-sache-fuer-naechstes-mal", titel: "Eine Sache für nächstes Mal", text: "Genau eine. Wer sich fünf Dinge vornimmt, macht keins davon.", stufe: "anfaenger" }, + { schluessel: "braucht-besprechung", titel: "Braucht Besprechung", text: "Etwas, das man nicht allein lösen kann – geht an die Betreuung.", stufe: "anfaenger" }, + { schluessel: "verweildauer-gegen-die-letzten-fuenf", titel: "Verweildauer gegen die letzten fuenf", text: "Nicht gegen das letzte Mal -- ein einzelner Vergleich ist Zufall. Fuenf Sendungen zeigen eine Richtung.", stufe: "profi" }, + { schluessel: "ein-versuch-eine-aenderung", titel: "Ein Versuch, eine Aenderung", text: "Wer Titel, Uhrzeit und Aufbau zugleich aendert, weiss hinterher nicht, was gewirkt hat. Eine Sache je Sendung.", stufe: "profi" }, + { schluessel: "erkenntnis-zurueck-in-die-vorlage", titel: "Erkenntnis zurueck in die Vorlage", text: "Was sich bewaehrt hat, wird Teil des Ablaufs -- sonst muss man es sich jedes Mal neu merken.", stufe: "meister" }, ], }; @@ -183,24 +195,33 @@ export const LIVE_PUNKTE = { export const COMMUNITY_PUNKTE = { moderation: [ - { schluessel: "regeln-stehen-sichtbar", titel: "Regeln stehen sichtbar", text: "Kurz, verstaendlich, an einer Stelle, die man findet. Drei Saetze reichen." }, - { schluessel: "jemand-kann-eingreifen", titel: "Jemand kann eingreifen", text: "Waehrend des Streams ist eine zweite Person mit Rechten da -- oder es ist klar, dass keine da ist." }, - { schluessel: "wortfilter-eingerichtet", titel: "Wortfilter eingerichtet", text: "Die offensichtlichen Sachen automatisch weg, damit man sich um den Rest kuemmern kann." }, - { schluessel: "was-passiert-bei-einem-verstoss", titel: "Was passiert bei einem Verstoss?", text: "Verwarnen, stummschalten, sperren -- vorher entscheiden, nicht im Moment." }, - { schluessel: "umgang-mit-minderjaehrigen", titel: "Umgang mit Minderjaehrigen", text: "Wie erkennt man sie, und was gilt dann? Das ist keine Ermessensfrage." }, + { schluessel: "regeln-stehen-sichtbar", titel: "Regeln stehen sichtbar", text: "Kurz, verstaendlich, an einer Stelle, die man findet. Drei Saetze reichen.", stufe: "anfaenger" }, + { schluessel: "jemand-kann-eingreifen", titel: "Jemand kann eingreifen", text: "Waehrend des Streams ist eine zweite Person mit Rechten da -- oder es ist klar, dass keine da ist.", stufe: "anfaenger" }, + { schluessel: "wortfilter-eingerichtet", titel: "Wortfilter eingerichtet", text: "Die offensichtlichen Sachen automatisch weg, damit man sich um den Rest kuemmern kann.", stufe: "fort" }, + { schluessel: "was-passiert-bei-einem-verstoss", titel: "Was passiert bei einem Verstoss?", text: "Verwarnen, stummschalten, sperren -- vorher entscheiden, nicht im Moment.", stufe: "fort" }, + { schluessel: "umgang-mit-minderjaehrigen", titel: "Umgang mit Minderjaehrigen", text: "Wie erkennt man sie, und was gilt dann? Das ist keine Ermessensfrage.", stufe: "anfaenger" }, + { schluessel: "eskalationsleiter-steht-schriftlich", titel: "Eskalationsleiter steht schriftlich", text: "Vier Stufen, in dieser Reihenfolge: ansprechen, Nachricht loeschen, kurze Auszeit, Sperre. Wer sie erst im Moment festlegt, entscheidet ungleich -- und Ungleichbehandlung ist das, was Communitys spaltet.", stufe: "profi" }, + { schluessel: "automatikfilter-stufe-begruendet", titel: "Automatikfilter: Stufe gewaehlt und begruendet", text: "Die Stufe des automatischen Filters ist eine Abwaegung, keine Voreinstellung: zu scharf loescht Harmloses, zu lasch laesst durch. Die Wahl gehoert aufgeschrieben.", stufe: "profi" }, + { schluessel: "wer-eskaliert-an-wen", titel: "Wer eskaliert an wen", text: "Ab wann entscheidet die Moderation nicht mehr selbst? Bei Bedrohung, Rechtsverstoss oder Unsicherheit geht es weiter -- und es muss klar sein, an wen.", stufe: "profi" }, + { schluessel: "moderatoren-eingewiesen-nicht-nur-ernannt", titel: "Moderatoren eingewiesen, nicht nur ernannt", text: "Rechte vergeben ist der kleinere Teil. Dazu gehoeren: die Regeln schriftlich, die Eskalationsleiter, die Werkzeuge einmal gezeigt.", stufe: "meister" }, + { schluessel: "ernstfall-einmal-geprobt", titel: "Ernstfall einmal geprobt", text: "Einmal durchspielen, wer was tut, wenn es kippt. Im Ernstfall zum ersten Mal darueber nachzudenken ist zu spaet.", stufe: "meister" }, ], aktion: [ - { schluessel: "neue-begruessen", titel: "Neue begruessen", text: "Wer zum ersten Mal da ist, wird angesprochen. Kostet zwei Sekunden und entscheidet, ob jemand bleibt." }, - { schluessel: "stammleute-erkennen", titel: "Stammleute erkennen", text: "Namen merken oder notieren. Wiedererkannt zu werden ist der halbe Grund wiederzukommen." }, - { schluessel: "etwas-geben-das-nur-hier-gibt", titel: "Etwas geben, das nur hier gibt", text: "Ein Insider, ein Ritual, ein Spitzname. Community entsteht aus Gemeinsamem." }, - { schluessel: "ausserhalb-des-streams-antworten", titel: "Ausserhalb des Streams antworten", text: "Kommentare und Nachrichten -- die Community lebt auch zwischen den Sendungen." }, + { schluessel: "neue-begruessen", titel: "Neue begruessen", text: "Wer zum ersten Mal da ist, wird angesprochen. Kostet zwei Sekunden und entscheidet, ob jemand bleibt.", stufe: "anfaenger" }, + { schluessel: "stammleute-erkennen", titel: "Stammleute erkennen", text: "Namen merken oder notieren. Wiedererkannt zu werden ist der halbe Grund wiederzukommen.", stufe: "fort" }, + { schluessel: "etwas-geben-das-nur-hier-gibt", titel: "Etwas geben, das nur hier gibt", text: "Ein Insider, ein Ritual, ein Spitzname. Community entsteht aus Gemeinsamem.", stufe: "fort" }, + { schluessel: "ausserhalb-des-streams-antworten", titel: "Ausserhalb des Streams antworten", text: "Kommentare und Nachrichten -- die Community lebt auch zwischen den Sendungen.", stufe: "fort" }, + { schluessel: "wiederkehrende-rubrik-mit-festem-termin", titel: "Wiederkehrende Rubrik mit festem Termin", text: "Etwas, das immer am selben Tag stattfindet. Ein Termin, auf den man sich freuen kann, bindet staerker als guter Einzelinhalt.", stufe: "profi" }, + { schluessel: "uebergabe-an-einen-zweiten-geregelt", titel: "Uebergabe an einen Zweiten geregelt", text: "Was passiert mit der Community, wenn man zwei Wochen ausfaellt? Wer nicht ersetzbar ist, kann nicht krank werden.", stufe: "meister" }, ], konflikt: [ - { schluessel: "ruhig-bleiben-und-nicht-oeffentlich-stre", titel: "Ruhig bleiben und nicht oeffentlich streiten", text: "Im Chat gewinnt niemand. Kurz ansagen, dann privat klaeren." }, - { schluessel: "was-ist-genau-passiert", titel: "Was ist genau passiert?", text: "Zeitpunkt, Beteiligte, Wortlaut. Ohne das ist jede Entscheidung angreifbar." }, - { schluessel: "beweise-sichern", titel: "Beweise sichern", text: "Bildschirmfoto oder Ausschnitt, solange es noch da ist. Chats verschwinden." }, - { schluessel: "betreuung-einbeziehen", titel: "Betreuung einbeziehen", text: "Bei allem, was groesser ist als ein blöder Kommentar. Dafuer ist sie da." }, - { schluessel: "danach-was-hat-gefehlt", titel: "Danach: was hat gefehlt?", text: "Regel unklar, niemand zum Eingreifen da, zu spaet gemerkt -- daraus wird der naechste Punkt oben." }, + { schluessel: "ruhig-bleiben-und-nicht-oeffentlich-stre", titel: "Ruhig bleiben und nicht oeffentlich streiten", text: "Im Chat gewinnt niemand. Kurz ansagen, dann privat klaeren.", stufe: "anfaenger" }, + { schluessel: "was-ist-genau-passiert", titel: "Was ist genau passiert?", text: "Zeitpunkt, Beteiligte, Wortlaut. Ohne das ist jede Entscheidung angreifbar.", stufe: "anfaenger" }, + { schluessel: "beweise-sichern", titel: "Beweise sichern", text: "Bildschirmfoto oder Ausschnitt, solange es noch da ist. Chats verschwinden.", stufe: "fort" }, + { schluessel: "betreuung-einbeziehen", titel: "Betreuung einbeziehen", text: "Bei allem, was groesser ist als ein blöder Kommentar. Dafuer ist sie da.", stufe: "anfaenger" }, + { schluessel: "danach-was-hat-gefehlt", titel: "Danach: was hat gefehlt?", text: "Regel unklar, niemand zum Eingreifen da, zu spaet gemerkt -- daraus wird der naechste Punkt oben.", stufe: "fort" }, + { schluessel: "entscheidung-dokumentiert", titel: "Entscheidung dokumentiert, nicht nur getroffen", text: "Wer, wann, warum, welche Stufe. Beim zweiten Mal mit derselben Person ist das der Unterschied zwischen 'wir haben da was' und 'ich glaube'.", stufe: "profi" }, + { schluessel: "regel-nachgezogen", titel: "Regel nachgezogen, damit es nicht wiederkommt", text: "Ein Vorfall, der von keiner Regel gedeckt war, ist eine Luecke -- kein Einzelfall. Die Regel wird ergaenzt, nicht der Fall vergessen.", stufe: "meister" }, ], }; @@ -215,22 +236,29 @@ export const COMMUNITY_PUNKTE = { export const TECHNIK_PUNKTE = { setup: [ - { schluessel: "mikrofon-richtig-eingestellt", titel: "Mikrofon richtig eingestellt", text: "Nicht uebersteuert, nicht zu leise, kein Rauschen. Einmal aufnehmen und anhoeren." }, - { schluessel: "kamera-scharf-und-gut-belichtet", titel: "Kamera scharf und gut belichtet", text: "Gesicht heller als der Hintergrund. Automatik oft abschalten -- sie pumpt." }, - { schluessel: "szenen-im-streaming-programm-angelegt", titel: "Szenen im Streaming-Programm angelegt", text: "Start, Vollbild, Pause, Ende. Wer waehrend der Sendung baut, sendet Chaos." }, - { schluessel: "bitrate-zur-leitung-passend", titel: "Bitrate zur Leitung passend", text: "Lieber stabil und etwas weicher als scharf mit Aussetzern." }, - { schluessel: "alles-einmal-komplett-getestet", titel: "Alles einmal komplett getestet", text: "Eine Probesendung von fuenf Minuten, aufgezeichnet und angesehen." }, + { schluessel: "mikrofon-richtig-eingestellt", titel: "Mikrofon richtig eingestellt", text: "Nicht uebersteuert, nicht zu leise, kein Rauschen. Einmal aufnehmen und anhoeren.", stufe: "anfaenger" }, + { schluessel: "kamera-scharf-und-gut-belichtet", titel: "Kamera scharf und gut belichtet", text: "Gesicht heller als der Hintergrund. Automatik oft abschalten -- sie pumpt.", stufe: "anfaenger" }, + { schluessel: "szenen-im-streaming-programm-angelegt", titel: "Szenen im Streaming-Programm angelegt", text: "Start, Vollbild, Pause, Ende. Wer waehrend der Sendung baut, sendet Chaos.", stufe: "fort" }, + { schluessel: "bitrate-zur-leitung-passend", titel: "Bitrate zur Leitung passend", text: "Lieber stabil und etwas weicher als scharf mit Aussetzern.", stufe: "fort" }, + { schluessel: "alles-einmal-komplett-getestet", titel: "Alles einmal komplett getestet", text: "Eine Probesendung von fuenf Minuten, aufgezeichnet und angesehen.", stufe: "anfaenger" }, + { schluessel: "tonfilter-in-der-richtigen-reihenfolge", titel: "Tonfilter in der richtigen Reihenfolge", text: "Erst Rauschunterdrueckung, dann Kompressor, dann Rauschsperre. Die Reihenfolge ist nicht beliebig: Ein Kompressor vor der Rauschunterdrueckung hebt das Rauschen mit an.", stufe: "profi" }, + { schluessel: "hardware-encoder-statt-prozessor", titel: "Hardware-Encoder statt Prozessor", text: "Wenn die Grafikkarte einen eigenen Encoder hat, uebernimmt der das Kodieren -- der Prozessor bleibt frei fuer alles andere. Das ist der groesste Einzelgewinn an Stabilitaet.", stufe: "profi" }, + { schluessel: "szenen-und-filter-gesichert", titel: "Szenen und Filter gesichert", text: "Die ganze Einrichtung als Sammlung exportiert und abgelegt. Nach einem Rechnerwechsel ist das der Unterschied zwischen zehn Minuten und einem Abend.", stufe: "meister" }, ], problem: [ - { schluessel: "ton-weg-oder-verzerrt", titel: "Ton weg oder verzerrt", text: "Wann genau, welches Geraet, was lief gleichzeitig? Ohne das findet es niemand." }, - { schluessel: "bild-ruckelt-oder-friert-ein", titel: "Bild ruckelt oder friert ein", text: "Auslastung, Leitung, Aufloesung -- eins nach dem anderen ausschliessen." }, - { schluessel: "stream-bricht-ab", titel: "Stream bricht ab", text: "Zeitpunkt notieren und im Protokoll des Programms nachsehen." }, - { schluessel: "ton-und-bild-laufen-auseinander", titel: "Ton und Bild laufen auseinander", text: "Meist ein Puffer. Wann faellt es auf, sofort oder erst spaeter?" }, + { schluessel: "ton-weg-oder-verzerrt", titel: "Ton weg oder verzerrt", text: "Wann genau, welches Geraet, was lief gleichzeitig? Ohne das findet es niemand.", stufe: "anfaenger" }, + { schluessel: "bild-ruckelt-oder-friert-ein", titel: "Bild ruckelt oder friert ein", text: "Auslastung, Leitung, Aufloesung -- eins nach dem anderen ausschliessen.", stufe: "anfaenger" }, + { schluessel: "stream-bricht-ab", titel: "Stream bricht ab", text: "Zeitpunkt notieren und im Protokoll des Programms nachsehen.", stufe: "fort" }, + { schluessel: "ton-und-bild-laufen-auseinander", titel: "Ton und Bild laufen auseinander", text: "Meist ein Puffer. Wann faellt es auf, sofort oder erst spaeter?", stufe: "fort" }, + { schluessel: "verworfene-bilder-abgelesen", titel: "Verworfene Bilder abgelesen, nicht geraten", text: "Das Programm zeigt, ob Bilder wegen der Leitung oder wegen des Kodierens verloren gehen. Das sind zwei verschiedene Fehler mit zwei verschiedenen Loesungen.", stufe: "profi" }, + { schluessel: "ausfall-mit-datum-festgehalten", titel: "Ausfall mit Datum festgehalten", text: "Jeder Ausfall bekommt einen Eintrag. Erst die Liste zeigt, ob es dasselbe Problem ist oder drei verschiedene.", stufe: "meister" }, ], loesung: [ - { schluessel: "was-hat-es-behoben", titel: "Was hat es behoben?", text: "Genau die eine Aenderung aufschreiben, nicht alles was probiert wurde." }, - { schluessel: "kommt-es-wieder", titel: "Kommt es wieder?", text: "Beim naechsten Mal nachsehen. Einmal weg ist nicht geloest." }, - { schluessel: "einstellung-gesichert", titel: "Einstellung gesichert", text: "Damit sie nach einem Update nicht wieder weg ist." }, + { schluessel: "was-hat-es-behoben", titel: "Was hat es behoben?", text: "Genau die eine Aenderung aufschreiben, nicht alles was probiert wurde.", stufe: "anfaenger" }, + { schluessel: "kommt-es-wieder", titel: "Kommt es wieder?", text: "Beim naechsten Mal nachsehen. Einmal weg ist nicht geloest.", stufe: "fort" }, + { schluessel: "einstellung-gesichert", titel: "Einstellung gesichert", text: "Damit sie nach einem Update nicht wieder weg ist.", stufe: "fort" }, + { schluessel: "genau-eine-aenderung-je-versuch", titel: "Genau eine Aenderung je Versuch", text: "Wer drei Dinge gleichzeitig aendert und es geht wieder, weiss nicht warum -- und beim naechsten Mal steht man wieder am Anfang.", stufe: "profi" }, + { schluessel: "loesung-als-anleitung-abgelegt", titel: "Loesung als Anleitung abgelegt", text: "So aufgeschrieben, dass jemand anderes sie nachvollziehen kann. Eine Loesung im Kopf einer Person ist keine Loesung des Teams.", stufe: "meister" }, ], }; export const CALL_LEITFAEDEN = [ diff --git a/workspace/assets/css/start.css b/workspace/assets/css/start.css index 5db2b224..7bfe5687 100644 --- a/workspace/assets/css/start.css +++ b/workspace/assets/css/start.css @@ -6859,3 +6859,120 @@ body.start .k-leiste .feldschild::after { color: transparent; } } + +/* ===================================================================== + DIE STUFENLEITER (screen7, 09.09.2026) + + Filipe: "ich will dass es in diesen kategorien ... kategorien gibt + wie jetzt, aber für anfänger, fortgeschrittene, profis .... und dan + will ich dass du das perfekt alles aufbaust ... komplett + profissionell und krasser." + + VIER STUFEN, VIER FARBEN -- aber die Farben sind nicht ausgesucht, + sondern geliehen: Es sind dieselben vier, die auf der Übersicht + schon "offen / dringend / läuft / erledigt" tragen. Wer die eine + Seite kennt, liest die andere ohne Legende. Eine fünfte Farbfamilie + hätte niemandem geholfen. + + Anfänger Babyblau — das Ruhige, der Anfang + Fortgeschritten Lila — in Bewegung + Profi Bernstein — es wird gemessen + Meister Grün — es läuft auch ohne dich + + AUFSTEIGEND HELLER, NICHT LAUTER. Die Stufen sind eine Leiter, keine + Warnstufen -- "Meister" ist kein Alarm. Deshalb tragen alle vier + dieselbe Deckkraft; nur der Farbton wechselt. Wer eine Stufe wählt, + sieht sie kräftig, die anderen bleiben still. + + DER GEWÄHLTE KNOPF IST GEDRÜCKT, NICHT NUR GEFÄRBT: eingelassener + Schatten statt Erhebung. Auf einem Farbfeld allein könnte man + ("welcher ist jetzt an?") raten -- an einer Vertiefung nicht. + ===================================================================== */ +.stufenleiter { + display: flex; flex-wrap: wrap; gap: 8px; + margin: 2px 0 14px; +} +.stufenleiter__knopf { + --sf: var(--akzent); + display: inline-flex; align-items: baseline; gap: 8px; + padding: 7px 13px; + border: 0; + clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); + background: + linear-gradient(150deg, color-mix(in srgb, var(--sf) 13%, transparent), transparent 62%), + linear-gradient(180deg, rgba(19, 26, 38, .92), rgba(10, 14, 22, .95)); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, .07), + inset 2px 0 0 color-mix(in srgb, var(--sf) 55%, transparent); + color: var(--text-leise); + font: inherit; font-size: .8rem; font-weight: 600; + cursor: pointer; + transition: color var(--tempo), box-shadow var(--tempo), background var(--tempo); +} +.stufenleiter__knopf[data-stufe="alle"] { --sf: #9fb3c8; } +.stufenleiter__knopf[data-stufe="anfaenger"] { --sf: #7ec8f2; } +.stufenleiter__knopf[data-stufe="fort"] { --sf: #a78bfa; } +.stufenleiter__knopf[data-stufe="profi"] { --sf: #e8a94e; } +.stufenleiter__knopf[data-stufe="meister"] { --sf: #5fc99a; } + +.stufenleiter__knopf:hover { + color: var(--text); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, .11), + inset 3px 0 0 var(--sf); +} +/* Gewählt: die Fläche trägt die Farbe, und der Knopf sitzt tiefer. */ +.stufenleiter__knopf[aria-pressed="true"] { + color: color-mix(in srgb, var(--sf) 80%, #ffffff); + background: + linear-gradient(150deg, color-mix(in srgb, var(--sf) 26%, transparent), transparent 70%), + linear-gradient(180deg, rgba(12, 17, 26, .96), rgba(7, 10, 17, .97)); + box-shadow: + inset 0 2px 5px -2px rgba(0, 0, 0, .9), + inset 3px 0 0 var(--sf); +} +.stufenleiter__zahl { + font-size: .72rem; font-variant-numeric: tabular-nums; + color: var(--text-still); +} +.stufenleiter__knopf[aria-pressed="true"] .stufenleiter__zahl { + color: color-mix(in srgb, var(--sf) 55%, #cfd9e6); +} +.stufenleiter__hilfe { + margin: -8px 0 14px; + font-size: .82rem; color: var(--text-leise); + max-width: 68ch; +} + +/* Die Könnensstufe am einzelnen Punkt -- klein, damit sie den Titel + nicht überstimmt. Sie ist eine Einordnung, keine Überschrift. + + Sie heißt `__koennen` und nicht `__stufe`: Letzteres ist hier schon + vergeben und trägt den BEARBEITUNGSstand (Offen / Passt so / + Verbessern). Im ersten Anlauf hatte ich den Namen ein zweites Mal + benutzt -- gemessen standen danach 66 Marken an 33 Punkten. */ +.fest-punkt__koennen { + --sf: #9fb3c8; + display: inline-block; margin-top: 6px; + padding: 2px 8px; + /* 0,72 rem = 11,52 px. Mit 0,66 waeren es 10,56 gewesen, und + pruef-css-klassen hat es sofort gemeldet: 44 Stellen unter 11,5 px + statt der Grundlinie 43. Eine Grundlinie, die man beim Hinzufuegen + still ueberschreitet, ist keine. */ + font-size: .72rem; font-weight: 700; + letter-spacing: .07em; text-transform: uppercase; + color: color-mix(in srgb, var(--sf) 78%, #ffffff); + background: color-mix(in srgb, var(--sf) 13%, transparent); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--sf) 34%, transparent); + clip-path: polygon(5px 0, 100% 0, 100% calc(100% - 5px), calc(100% - 5px) 100%, 0 100%, 0 5px); +} +.fest-punkt__koennen[data-stufe="anfaenger"] { --sf: #7ec8f2; } +.fest-punkt__koennen[data-stufe="fort"] { --sf: #a78bfa; } +.fest-punkt__koennen[data-stufe="profi"] { --sf: #e8a94e; } +.fest-punkt__koennen[data-stufe="meister"] { --sf: #5fc99a; } + +.fest-gruppe__leer { + margin: 4px 0 0; padding: 10px 12px; + font-size: .85rem; color: var(--text-still); + border: 1px dashed rgba(150, 186, 220, .22); +} diff --git a/workspace/assets/js/checkliste.js b/workspace/assets/js/checkliste.js index 87a24fa9..e9546b3d 100644 --- a/workspace/assets/js/checkliste.js +++ b/workspace/assets/js/checkliste.js @@ -44,6 +44,45 @@ auf den ersten. */ const gewaehlt = {}; + /* ===================================================================== + DIE VIER KÖNNENSSTUFEN (09.09.2026, screen7) + + Filipe: "ich will dass es in diesen kategorien ... kategorien gibt + wie jetzt, aber für anfänger, fortgeschrittene, profis .... falls + es noch eine kategorie gibt füge ruhig hinzu." + + Die vierte ist dazugekommen und sie ist nicht ausgedacht: In den + gängigen Kompetenzmodellen (Dreyfus) folgt auf "kompetent" noch + eine Stufe, auf der es nicht mehr um das eigene Können geht, + sondern darum, dass es OHNE einen weiterläuft -- Vorlagen, + eingewiesene Vertretung, abgelegte Lösungen. Genau daran hängen + hier die elf Punkte der obersten Stufe. + + WARUM DIE STUFE AM PUNKT HÄNGT UND NICHT AN DER GRUPPE: Eine + Gruppe ist ein ABLAUF ("Vor der Sendung"), eine Stufe ist ein + KÖNNEN. Wer sie zu Gruppen machte, hätte zwölf Abschnitte statt + drei und müsste dieselbe Frage viermal stellen. So bleibt der + Ablauf die Gliederung, und die Stufe ist ein Filter darüber. + + DIE VORGABE IST "ALLE". Ein Filter, der beim Öffnen schon etwas + versteckt, lässt einen Punkte suchen, die man gestern noch + gesehen hat. Wer filtert, hat es selbst getan und weiß es. */ + const STUFEN_LEITER = [ + { schluessel: '', name: 'Alle' }, + { schluessel: 'anfaenger', name: 'Anfänger', + hilfe: 'Was von Anfang an sitzen muss. Ohne diese Punkte hilft alles Weitere nichts.' }, + { schluessel: 'fort', name: 'Fortgeschritten', + hilfe: 'Für alle, die regelmäßig senden. Hier entsteht Routine statt Zufall.' }, + { schluessel: 'profi', name: 'Profi', + hilfe: 'Gemessen statt geschätzt: konkrete Werte, Belege, ein Versuch nach dem anderen.' }, + { schluessel: 'meister', name: 'Meister', + hilfe: 'Was auch ohne dich weiterläuft — Vorlagen, Vertretung, abgelegte Lösungen.' }, + ]; + + /* Welche Stufe gerade gefiltert ist, je Bereich. Wie die + Klappzustände: Es soll beim Neuzeichnen nicht zurückspringen. */ + const stufenFilter = {}; + window.checkliste = async function (behaelter, bereich) { if (!behaelter) return; let daten; @@ -111,6 +150,42 @@ block.append(bilanz); } + /* ---- Die Stufenleiste ---- + Sie steht ZWISCHEN Bilanz und Gruppen: erst was los ist, dann + womit man es eingrenzt, dann die Sache selbst. */ + const gefiltert = stufenFilter[bereich] || ''; + if (alle.some((p) => p.stufe)) { + const leiter = el('div', 'stufenleiter'); + leiter.setAttribute('role', 'group'); + leiter.setAttribute('aria-label', 'Nach Könnensstufe filtern'); + for (const st of STUFEN_LEITER) { + const n = st.schluessel + ? alle.filter((p) => p.stufe === st.schluessel).length + : alle.length; + /* EINE STUFE OHNE PUNKTE BEKOMMT KEINEN KNOPF. Ein Filter, der + auf eine leere Liste führt, sieht aus wie ein Fehler. */ + if (!n) continue; + const b = el('button', 'stufenleiter__knopf'); + b.type = 'button'; + b.dataset.stufe = st.schluessel || 'alle'; + b.setAttribute('aria-pressed', String(gefiltert === st.schluessel)); + if (st.hilfe) b.title = st.hilfe; + b.append(el('span', 'stufenleiter__name', st.name)); + b.append(el('span', 'stufenleiter__zahl', String(n))); + b.addEventListener('click', () => { + stufenFilter[bereich] = gefiltert === st.schluessel ? '' : st.schluessel; + window.checkliste(behaelter, bereich); + }); + leiter.append(b); + } + block.append(leiter); + /* Der Satz zur gewählten Stufe steht DA, nicht nur im Titel: Ein + Hinweis, den man nur mit der Maus findet, gibt es auf dem Handy + nicht. */ + const erklaerung = STUFEN_LEITER.find((x) => x.schluessel === gefiltert)?.hilfe; + if (erklaerung) block.append(el('p', 'stufenleiter__hilfe', erklaerung)); + } + /* ---- Die Gruppen ---- */ const aufgeklappt = standLesen(bereich); const markierte = []; /* Gruppen mit etwas zum Verbessern */ @@ -133,7 +208,10 @@ pfeil.setAttribute('aria-hidden', 'true'); gk.append(pfeil); gk.append(el('h3', 'fest-gruppe__name', g.name)); - gk.append(el('span', 'fest-gruppe__zahl', String(g.punkte.length))); + /* Die Zahl zeigt, was der Filter uebriglaesst -- sonst stuende + "8" an einer Gruppe, in der drei Punkte sichtbar sind. */ + gk.append(el('span', 'fest-gruppe__zahl', String( + (stufenFilter[bereich] ? g.punkte.filter((p) => p.stufe === stufenFilter[bereich]) : g.punkte).length))); /* Das Merkzeichen am Gruppenkopf ist der Grund, warum zugeklappte Gruppen überhaupt vertretbar sind: Ohne es wäre eine Markierung @@ -150,9 +228,19 @@ if (g.text) koerper.append(el('p', 'fest-gruppe__text', g.text)); const liste = el('div', 'fest-punkte'); - for (const p of g.punkte) { + const sichtbar = gefiltert + ? g.punkte.filter((p) => p.stufe === gefiltert) + : g.punkte; + for (const p of sichtbar) { liste.append(punktBauen(p, daten, bereich, behaelter)); } + /* Eine Gruppe, in der der Filter nichts uebrig laesst, sagt das -- + statt leer dazustehen. Ein leerer Kasten liest sich wie ein + Fehler, ein Satz wie eine Antwort. */ + if (!sichtbar.length) { + liste.append(el('p', 'fest-gruppe__leer', + 'Auf dieser Stufe steht hier nichts an.')); + } koerper.append(liste); abschnitt.append(koerper); @@ -261,6 +349,24 @@ } if (p.text) links.append(el('p', 'fest-punkt__beschreibung', p.text)); if (p.format) links.append(el('span', 'fest-punkt__marke', p.format)); + /* Die Koennensstufe steht AM PUNKT, nicht nur im Filter. Sonst + weiss man beim Blaettern durch "Alle" nicht, warum ein Punkt + schwerer aussieht als der davor. */ + if (p.stufe) { + const name = { anfaenger: 'Anfänger', fort: 'Fortgeschritten', + profi: 'Profi', meister: 'Meister' }[p.stufe] || p.stufe; + /* `__koennen`, NICHT `__stufe`. Den Namen `fest-punkt__stufe` gibt + es hier laengst -- er traegt den BEARBEITUNGSstand (Offen / + Passt so / Verbessern). Im ersten Anlauf hatte ich ihn ein + zweites Mal vergeben; gemessen standen danach 66 Marken an 33 + Punkten, und mein neues CSS faerbte auch den alten Behaelter + mit. Zwei verschiedene Dinge unter einem Namen ist derselbe + Fehler wie zwei Regeln fuer dieselbe Sache, nur eine Ebene + frueher. */ + const m = el('span', 'fest-punkt__koennen', name); + m.dataset.stufe = p.stufe; + links.append(m); + } kopf.append(links); /* Die Marke rechts -- immer sichtbar, auch für den Creator, auch diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 31f670cc..97f749c5 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -14,10 +14,10 @@ - - - - + + + + @@ -217,10 +217,10 @@ - - - - - + + + + + diff --git a/workspace/automation.html b/workspace/automation.html index 64408137..ec2fb7f9 100644 --- a/workspace/automation.html +++ b/workspace/automation.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -140,10 +140,10 @@ - - - - - + + + + + diff --git a/workspace/bereich.html b/workspace/bereich.html index ed7a31ea..6fabcc25 100644 --- a/workspace/bereich.html +++ b/workspace/bereich.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -149,14 +149,14 @@ - - - - - - - - - + + + + + + + + + diff --git a/workspace/calls.html b/workspace/calls.html index 38ae21a5..e5eec3d8 100644 --- a/workspace/calls.html +++ b/workspace/calls.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -82,11 +82,11 @@ - - - - - - + + + + + + diff --git a/workspace/chat.html b/workspace/chat.html index 62a3c59d..1c2f173d 100644 --- a/workspace/chat.html +++ b/workspace/chat.html @@ -14,17 +14,17 @@ - - + + - - - + + + @@ -160,10 +160,10 @@ - - - - - + + + + + diff --git a/workspace/content.html b/workspace/content.html index 2c32aff8..26e90347 100644 --- a/workspace/content.html +++ b/workspace/content.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -172,12 +172,12 @@ - - - - - - - + + + + + + + diff --git a/workspace/dateien.html b/workspace/dateien.html index 76f3542e..f740504a 100644 --- a/workspace/dateien.html +++ b/workspace/dateien.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -101,10 +101,10 @@ - - - - - + + + + + diff --git a/workspace/index.html b/workspace/index.html index 55513bbc..463fd1ea 100644 --- a/workspace/index.html +++ b/workspace/index.html @@ -32,7 +32,7 @@ - + @@ -401,6 +401,6 @@ - + diff --git a/workspace/kalender.html b/workspace/kalender.html index 0e26d8b5..88c624fa 100644 --- a/workspace/kalender.html +++ b/workspace/kalender.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -340,11 +340,11 @@ - - - - - - + + + + + + diff --git a/workspace/leistung.html b/workspace/leistung.html index 4bb58038..c6e6fc53 100644 --- a/workspace/leistung.html +++ b/workspace/leistung.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -217,10 +217,10 @@ - - - - - + + + + + diff --git a/workspace/personen.html b/workspace/personen.html index cd2e3aef..1071f064 100644 --- a/workspace/personen.html +++ b/workspace/personen.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -324,10 +324,10 @@ - - - - - + + + + + diff --git a/workspace/profil.html b/workspace/profil.html index c24cf1de..abb0b9a5 100644 --- a/workspace/profil.html +++ b/workspace/profil.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -207,11 +207,11 @@ - - - - - - + + + + + + diff --git a/workspace/report.html b/workspace/report.html index 83af519c..86940ea4 100644 --- a/workspace/report.html +++ b/workspace/report.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -99,11 +99,11 @@ - - - - - - + + + + + + diff --git a/workspace/scouting.html b/workspace/scouting.html index facd4fd1..2ffe7927 100644 --- a/workspace/scouting.html +++ b/workspace/scouting.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -132,10 +132,10 @@ - - - - - + + + + + diff --git a/workspace/start.html b/workspace/start.html index 17f47fda..af0d317d 100644 --- a/workspace/start.html +++ b/workspace/start.html @@ -14,12 +14,12 @@ - - + + - - + + @@ -580,10 +580,10 @@

- - - - - + + + + + diff --git a/workspace/startcheck.html b/workspace/startcheck.html index 67096f64..5e7a5edc 100644 --- a/workspace/startcheck.html +++ b/workspace/startcheck.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -78,11 +78,11 @@ - - - - - - + + + + + + diff --git a/workspace/steckbrief.html b/workspace/steckbrief.html index 54a520b0..73e21436 100644 --- a/workspace/steckbrief.html +++ b/workspace/steckbrief.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -119,10 +119,10 @@ - - - - - + + + + + diff --git a/workspace/uebersicht.html b/workspace/uebersicht.html index 86db164a..77a8de4d 100644 --- a/workspace/uebersicht.html +++ b/workspace/uebersicht.html @@ -14,13 +14,13 @@ - - + + - - - + + + @@ -142,11 +142,11 @@ - + - - - - + + + + diff --git a/workspace/wissen.html b/workspace/wissen.html index 92d56879..f1d7bf36 100644 --- a/workspace/wissen.html +++ b/workspace/wissen.html @@ -14,11 +14,11 @@ - - - - - + + + + + @@ -183,10 +183,10 @@ - - - - - + + + + +