{"version":3,"names":["KLASSE","ANTWORT","join","WILL_ANTWORTEN","imRahmen","document","body","classList","contains","bereit","fn","addEventListener","once","imRahmenBereit","bis","Date","now","warte","setTimeout","abgemeldet","documentElement","seite","window","e","origin","indexOf","data","type","kommentar_senden","url","text","TEXT","antworten","spur","auto_antworten","KOMMENTAR_HERKUNFT","kommentarErledigt","d","quelle","source","plan","sig","nr","antwort","x","postMessage","err","fetch","credentials","headers","then","r","json","c","rumpf","URLSearchParams","set","method","csrf","toString","catch","j","status","ok","fehler","errors","error","melde_wer","u","current_user","parent","name","String","username","benutzer","bild","avatar_template","test","location","replace","melde_zustand","setAttribute","angemeldet","direkt_pflegen","was","ry","Math","round","scrollY","melde_editor","anmelden_ausserhalb","ziel","encodeURIComponent","a","createElement","href","target","appendChild","click","parentNode","removeChild","komposer","querySelector","knopf","vorhanden","b","className","textContent","title","knopfSetzen","getBoundingClientRect","height","style","top","left","right","scrollX","scrolle_im_rahmen","el","bottom","innerHeight","scrollTo","max","freigeben","add","forEach","v","verzug","k","schliessen","remove","DIREKT","ANTWORT_THEMA","FUSS","fuss_element","alle","querySelectorAll","i","length","fuss_im_bild","direkt_knopf","da","hidden","direkt_klick","api_antworten","go","owner","require","getOwnerWithFallback","getOwner","lookup","send","composer","thema","model","folge","draft_sequence","undefined","draftSequence","open","action","draftKey","draft_key","id","topic","fuss_klicken_mit_nachladen","zurueck","fertig","z","scrollHeight","preventDefault","sofort","EDITOR","pflegeLaeuft","direkt_pflegen_gedrosselt","requestAnimationFrame","passive","closest","stopPropagation","autoLaeuft","textGesetzt","EINGABE","ABSENDEN","text_einsetzen","ta","value","dispatchEvent","Event","bubbles","focus","setSelectionRange","text_absenden","disabled","letzteGeste","editorDa","geste","MutationObserver","jetzt","observe","childList","subtree","pathname","search","get","close","BLOG","IN_APP","navigator","userAgent","zum_blog","defaultPrevented","button","metaKey","ctrlKey","shiftKey","altKey","gekocht","beitrag","exec","daten","FormData","append","getAttribute","sendBeacon","BLOG_START","MSA","logo_link","logo_zum_blog","l","logo_und_msa","panel","sch","insertAdjacentHTML","MSA_ZIEL","msa_zahl","m","cookie","n","parseInt","t","stand","toggle","SCHALTER","dm_schalter","F","shaForumFarbe","setzen","dunkel","anwenden","BLOG_MENUE","kopf_wie_blog","matchMedia","matches","symbol_links","links","Infinity","inhalt","ueber","firstElementChild","width","min","wie_blog_einpassen","nav","ZIEL","STUFEN","p","messen","letzter","s","getComputedStyle","si","parseFloat","paddingLeft","paddingRight","luecke","luft","schrift","fontSize","polster","runde","fehlt","art","grenze","f","floor","setProperty","removeProperty","burger_links","rahmen","probe","cssText","breit","offsetWidth","fenster","clientWidth","burger_breite","burger_zeile","kopf","zeichen","cloneNode","kopfwrap","hoehe","offsetHeight","getPropertyValue","wort","blog_menue","logo","previousElementSibling","html","nextElementSibling","zeile","passt","stufe","reihe","wrap","alsZeile","innerWidth","innerHTML","chat_kopf","trim","gewartet","clearTimeout","geplant"],"sources":["theme-1-inline-common-head_tag-2.js"],"sourcesContent":["\n(function () {\n\t\"use strict\";\n\n\tvar KLASSE = \"sha-antwort-frei\";\n\t// ⚠️ Der Anmelde-Knopf und der Editorbereich standen hier zeitweise mit drin,\n\t// damit sich der Ablauf abgemeldet pruefen laesst. Das war bequem und falsch:\n\t// abgemeldet gibt es keinen Editor, das Schliessen-× erschien trotzdem und\n\t// haette nichts zu schliessen gehabt (Karim, 16.09.2026). Ausloeser sind nur\n\t// noch echte Antwort-Knoepfe.\n\t//\n\t// ⚠️⚠️ EIN THEMA OHNE ANTWORTEN SIEHT ANDERS AUS, und genau daran ist das hier\n\t//    am 16.09.2026 zweimal vorbeigelaufen. Discourse rendert dann einen eigenen\n\t//    Fussbereich `.embed-topic-footer` mit zwei Knoepfen, und KEINER davon\n\t//    traegt die Klassen, nach denen hier gesucht wurde:\n\t//\n\t//      .topic-footer-main-buttons     > button.btn.btn-icon-text.btn-primary\n\t//                                       \"Antworten\", OHNE `.create`\n\t//      .embed-topic-footer__first-reply > button.btn.btn-primary\n\t//                                       \"Anmelden, um zu antworten\"\n\t//\n\t//    Karim: \"Ich kann nicht auf Antworten klicken. Es passiert nichts.\" Genau\n\t//    das: der Klick traf keine Regel, `sha-antwort-frei` kam nie an den Body,\n\t//    und unser CSS liess `#reply-control` auf `display:none`. Der Editor ging\n\t//    auf und war unsichtbar. Ein leeres Thema ist im Bestand der Normalfall --\n\t//    jedes frisch angelegte ist eins.\n\t// ⚠️⚠️ EINE Liste, und das ist die Lehre aus zwei Fehlversuchen am 16.09.2026.\n\t//\n\t//    Der erste Anlauf suchte `.topic-footer-main-buttons .create` -- die Klasse\n\t//    `.create` gibt es im leeren Thema nicht. Der zweite Anlauf nahm\n\t//    `.topic-footer-main-buttons .btn-primary` dazu und steckte\n\t//    `.embed-topic-footer__first-reply .btn` in eine ZWEITE Liste, die nur\n\t//    abgemeldet und nur auf schmalem Rahmen etwas tat. Angemeldet am Desktop\n\t//    fiel der Klick damit durch beide Zweige hindurch und tat gar nichts.\n\t//\n\t//    Gemessen am 16.09.2026 an Thema 792 bei 1030 px:\n\t//\n\t//      .topic-footer-main-buttons .btn-primary   \"Antworten\"   0 x 0 px, UNSICHTBAR\n\t//      .embed-topic-footer__first-reply .btn                   289 x 47 px, sichtbar\n\t//\n\t//    Der sichtbare, mittige Knopf unter \"Schreib die erste Antwort!\" ist also\n\t//    IMMER derselbe -- nur seine Beschriftung wechselt: abgemeldet \"Anmelden,\n\t//    um zu antworten\", angemeldet \"Antworten\". Genau diesen einen drueckt der\n\t//    Leser, und genau der fehlte.\n\t//\n\t//    ⚠️ Deshalb wird hier NICHT mehr nach der Absicht des Knopfes sortiert,\n\t//    sondern nur noch gefragt: \"will jemand antworten?\" Was daraus folgt,\n\t//    entscheidet allein der Anmeldezustand, unten im Behandler.\n\tvar ANTWORT = [\n\t\t\".btn-primary.create\",\n\t\t\".topic-footer-main-buttons .create\",\n\t\t// Der normale Themen-Fussbereich. Im Rahmen 0 x 0 px, aber er bleibt\n\t\t// drin: er traegt den Knopf in Themen MIT Antworten.\n\t\t\".topic-footer-main-buttons .btn-primary\",\n\t\t// Der sichtbare Knopf im leeren Thema, beide Beschriftungen.\n\t\t\".embed-topic-footer__first-reply .btn\",\n\t\t// Der Anmelde-Knopf in einem Thema, das schon Antworten hat.\n\t\t\".embed-mode-composer__signin-cta\",\n\t\t\".reply-to-post\",\n\t\t\".post-controls .reply\",\n\t\t\"[data-action='reply']\"\n\t].join(\",\");\n\n\t/**\n\t * ⚠️⚠️ DER ANTWORT-WUNSCH KOMMT PER NACHRICHT, NICHT UEBER DIE ADRESSE.\n\t *\n\t *    Er stand bis 0.11.0 als `&sha_antworten=1` in der Rahmenadresse und ist\n\t *    dort **nie angekommen**. Gemessen am 16.09.2026:\n\t *\n\t *        curl -I \"/embed/comments?topic_id=258&full_app=true&sha_antworten=1\"\n\t *        -> HTTP 302 nach /t/<slug>/258?embed_mode=true\n\t *\n\t *    `/embed/comments` ist eine **Weiterleitung**, und der Server nimmt nur\n\t *    `embed_mode` mit. Jeder Zusatzparameter faellt weg, bevor hier auch nur\n\t *    eine Zeile laeuft -- kein Ember, kein Timing, schlicht ein 302.\n\t *\n\t *    Die Aufzeichnung zeigte darum jedes Mal `will-antworten-nein`, obwohl\n\t *    die Seite die Adresse nachweislich richtig gebaut hatte. Zwei Runden\n\t *    wurden an der falschen Stelle gesucht, weil beide Seiten \"richtig\"\n\t *    aussahen und die Wahrheit dazwischen lag.\n\t */\n\tvar WILL_ANTWORTEN = false;\n\n\tfunction imRahmen() {\n\t\treturn document.body && document.body.classList.contains(\"embed-mode\");\n\t}\n\n\t/**\n\t * Fuehrt eine Funktion aus, sobald der `body` da ist.\n\t *\n\t * ⚠️⚠️ DAS SKRIPT LAEUFT IM `head`. `document.body` ist dort noch `null`, und\n\t *    damit war jedes `if (imRahmen())` auf oberster Ebene **immer falsch**.\n\t *    Zwei Bloecke sind daran am 16.09.2026 stillschweigend nie gelaufen: die\n\t *    Meldung des Anmeldezustands und das automatische Oeffnen des Editors.\n\t *    Karim: \"warum ist da noch nicht das Fenster mit dem Kommentar\n\t *    vorgeladen???\" -- Genau deshalb.\n\t */\n\tfunction bereit(fn) {\n\t\tif (document.body) {\n\t\t\tfn();\n\t\t\treturn;\n\t\t}\n\t\tdocument.addEventListener(\"DOMContentLoaded\", fn, { once: true });\n\t}\n\n\t/**\n\t * Fuehrt eine Funktion aus, sobald feststeht, dass wir IM RAHMEN stehen.\n\t *\n\t * ⚠️⚠️ `bereit()` allein genuegt nicht, und das war der zweite Fehlschlag am\n\t *    16.09.2026. Die Klasse `embed-mode` steht nicht im ausgelieferten HTML --\n\t *    Discourse setzt sie erst, wenn die Ember-Anwendung gestartet ist. Zu\n\t *    `DOMContentLoaded` ist sie noch nicht da, `imRahmen()` also falsch, und\n\t *    beide Bloecke liefen wieder nicht: weder die Meldung des\n\t *    Anmeldezustands noch das automatische Oeffnen des Editors.\n\t *\n\t *    Gemessen: die Seite bekam ueber neun Sekunden **keine einzige**\n\t *    Nachricht aus dem Rahmen.\n\t *\n\t *    Deshalb wird gewartet, nicht gefragt. Zehn Sekunden, dann ist es eben\n\t *    kein Rahmen.\n\t */\n\tfunction imRahmenBereit(fn) {\n\t\tvar bis = Date.now() + 10000;\n\n\t\t(function warte() {\n\t\t\tif (imRahmen()) {\n\t\t\t\tfn();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() < bis) {\n\t\t\t\tsetTimeout(warte, 100);\n\t\t\t}\n\t\t})();\n\t}\n\n\t/**\n\t * Ist gerade niemand angemeldet?\n\t *\n\t * Discourse haengt die Klasse `anon` ans <html>-Element. Das ist die einzige\n\t * Angabe, die ohne einen eigenen Abruf zu haben ist -- und sie wird gebraucht,\n\t * weil der Knopf \"Antworten\" im leeren Thema AUCH abgemeldet erscheint. Ohne\n\t * diese Unterscheidung liefe ein abgemeldeter Leser am Handy wieder in\n\t * Discourses Modal, also in genau den Fehler, den `anmelden_ausserhalb()`\n\t * beseitigt.\n\t */\n\tfunction abgemeldet() {\n\t\treturn document.documentElement.classList.contains(\"anon\");\n\t}\n\n\t/**\n\t * Die Adresse der Seite, die uns einbettet.\n\t *\n\t * ⚠️ Von hier aus nicht zu ermitteln: fremde Herkunft, `parent.location` ist\n\t * gesperrt, und `document.referrer` traegt sie nicht verlaesslich. Die Seite\n\t * schickt sie uns nach dem Laden des Rahmens (`assets/embed.js`). Gebraucht\n\t * wird sie, um den Leser nach dem Anmelden dorthin zurueckzubringen.\n\t */\n\tvar seite = \"\";\n\n\twindow.addEventListener(\"message\", function (e) {\n\t\tif (e.origin.indexOf(\"smarthomeassistent.de\") === -1) {\n\t\t\treturn;\n\t\t}\n\t\tif (e.data && e.data.type === \"sha-forum-kommentar\") {\n\t\t\tkommentar_senden(e);\n\t\t\treturn;\n\t\t}\n\t\tif (e.data && e.data.type === \"sha-forum-seite\") {\n\t\t\tif (typeof e.data.url === \"string\") {\n\t\t\t\tseite = e.data.url;\n\t\t\t}\n\t\t\t// ⚠️ Seit 20.09.2026 reist der geschriebene Kommentar mit. Die Seite\n\t\t\t//    legt das Thema erst an, wenn wirklich jemand etwas geschrieben\n\t\t\t//    hat (Befund 8at) -- der Text steht dann aber auf IHRER Seite,\n\t\t\t//    und schreiben kann ihn nur der Composer hier drin.\n\t\t\tif (typeof e.data.text === \"string\" && e.data.text) {\n\t\t\t\tTEXT = e.data.text;\n\t\t\t}\n\t\t\tif (e.data.antworten) {\n\t\t\t\tWILL_ANTWORTEN = true;\n\t\t\t\tspur(\"wunsch-per-nachricht\");\n\t\t\t\tauto_antworten();\n\t\t\t}\n\t\t}\n\t}, false);\n\n\t/**\n\t * ⚠️⚠️ THEMA UND ERSTER KOMMENTAR IN EINEM ZUG (seit 12.10.2026, Befund 8bm).\n\t *\n\t *    Die Artikelseite schickt Bauplan (von WordPress unterschrieben) und\n\t *    Text an diesen Rahmen -- meist den unsichtbaren Pruefrahmen. Von hier\n\t *    geht beides mit der Sitzung und dem CSRF-Token des Lesers an das\n\t *    Plugin `sha-kommentar`, das Thema und Kommentar in EINER Transaktion\n\t *    anlegt. Scheitert der Kommentar, entsteht kein Thema.\n\t *\n\t * ⚠️ NUR von www.smarthomeassistent.de, zeichengenau. Die lockere Pruefung\n\t *    oben (`indexOf`) reicht fuer Lesendes, hier wird im Namen des\n\t *    angemeldeten Lesers geschrieben: eine fremde Seite, die das Forum\n\t *    einrahmt, darf das nie ausloesen koennen.\n\t *\n\t * ⚠️ Jede Auftragsnummer nur einmal. Eine doppelt zugestellte Nachricht\n\t *    waere sonst ein doppelter Kommentar.\n\t */\n\tvar KOMMENTAR_HERKUNFT = \"https://www.smarthomeassistent.de\";\n\tvar kommentarErledigt = {};\n\n\tfunction kommentar_senden(e) {\n\t\tvar d = e.data;\n\t\tvar quelle = e.source;\n\n\t\tif (e.origin !== KOMMENTAR_HERKUNFT || !quelle || !d.plan || !d.sig || !d.text) {\n\t\t\treturn;\n\t\t}\n\t\tif (kommentarErledigt[d.nr]) {\n\t\t\treturn;\n\t\t}\n\t\tkommentarErledigt[d.nr] = true;\n\n\t\tfunction antwort(x) {\n\t\t\tx.type = \"sha-forum-kommentar-ergebnis\";\n\t\t\tx.nr = d.nr;\n\t\t\ttry {\n\t\t\t\tquelle.postMessage(x, KOMMENTAR_HERKUNFT);\n\t\t\t} catch (err) {\n\t\t\t\t// Die Seite ist weg. Im Forum ist trotzdem alles oder nichts passiert.\n\t\t\t}\n\t\t}\n\n\t\tspur(\"kommentar-empfangen\");\n\n\t\tfetch(\"/session/csrf.json\", {\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders: { \"X-Requested-With\": \"XMLHttpRequest\" }\n\t\t})\n\t\t\t.then(function (r) {\n\t\t\t\treturn r.json();\n\t\t\t})\n\t\t\t.then(function (c) {\n\t\t\t\tvar rumpf = new URLSearchParams();\n\t\t\t\trumpf.set(\"plan\", d.plan);\n\t\t\t\trumpf.set(\"sig\", d.sig);\n\t\t\t\trumpf.set(\"raw\", d.text);\n\t\t\t\treturn fetch(\"/sha-kommentar/anlegen.json\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tcredentials: \"same-origin\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"X-CSRF-Token\": c && c.csrf ? c.csrf : \"\",\n\t\t\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\n\t\t\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\"\n\t\t\t\t\t},\n\t\t\t\t\tbody: rumpf.toString()\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(function (r) {\n\t\t\t\treturn r.json().catch(function () {\n\t\t\t\t\treturn {};\n\t\t\t\t}).then(function (j) {\n\t\t\t\t\treturn { status: r.status, ok: r.ok, j: j || {} };\n\t\t\t\t});\n\t\t\t})\n\t\t\t.then(function (x) {\n\t\t\t\tif (x.ok && x.j.ok) {\n\t\t\t\t\tspur(\"kommentar-angelegt\");\n\t\t\t\t\tantwort(x.j);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar fehler = (x.j.errors && x.j.errors.join(\" \")) || x.j.error || \"\";\n\t\t\t\tif (x.status === 403 && !fehler) {\n\t\t\t\t\tfehler = \"Du bist im Forum nicht angemeldet. Tippe auf „Anmelden und kommentieren“, dein Text bleibt erhalten.\";\n\t\t\t\t}\n\t\t\t\tspur(\"kommentar-abgelehnt-\" + x.status);\n\t\t\t\tantwort({ ok: false, fehler: fehler });\n\t\t\t})\n\t\t\t.catch(function () {\n\t\t\t\tspur(\"kommentar-fehler\");\n\t\t\t\tantwort({ ok: false });\n\t\t\t});\n\t}\n\n\t/**\n\t * Sagt der Seite, ob dieser Leser im Forum angemeldet ist.\n\t *\n\t * ⚠️ Die Seite kann das nicht selbst herausfinden: fremde Herkunft, und die\n\t * Cookies des Forums sind fuer sie Drittanbieter-Cookies -- auf iOS gar nicht\n\t * lesbar. Der Rahmen weiss es dagegen sicher. Karim am 16.09.2026: \"Du musst\n\t * direkt im ersten Schritt erkennen, ob die Person schon angemeldet ist.\"\n\t */\n\t/**\n\t * Sagt der Seite, WER angemeldet ist.\n\t *\n\t * ⚠️ Karim am 17.09.2026: \"Ich moechte, dass man sehen kann, dass man als\n\t * Benutzer angemeldet ist. So wie es gerade ist, hat es keinerlei\n\t * persoenlichen Charakter.\"\n\t *\n\t * ⚠️ Der Name steht nicht im Markup des Rahmens -- die Kopfleiste des Forums\n\t * ist in der Einbettung ausgeblendet. Er kommt deshalb aus\n\t * `/session/current.json`, und das geht nur VON HIER: im Rahmen ist das die\n\t * eigene Herkunft, auf der Seite waere es ein Drittanbieter-Aufruf, den iOS\n\t * gar nicht beantwortet.\n\t *\n\t * ⚠️ Abgemeldet antwortet die Route mit 404. Dann wird nichts gemeldet, und\n\t * die Seite zeigt auch nichts -- kein \"nicht angemeldet\", das niemandem hilft.\n\t */\n\tfunction melde_wer() {\n\t\ttry {\n\t\t\tfetch(\"/session/current.json\", { credentials: \"same-origin\" })\n\t\t\t\t.then(function (r) {\n\t\t\t\t\treturn r.ok ? r.json() : null;\n\t\t\t\t})\n\t\t\t\t.then(function (d) {\n\t\t\t\t\tvar u = d && d.current_user;\n\t\t\t\t\tif (!u || !window.parent || window.parent === window) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"sha-forum-wer\",\n\t\t\t\t\t\t\tname: String(u.name || u.username || \"\"),\n\t\t\t\t\t\t\tbenutzer: String(u.username || \"\"),\n\t\t\t\t\t\t\t// ⚠️ `avatar_template` ist meist ein PFAD (`/user_avatar/…`),\n\t\t\t\t\t\t\t// bei Gravatar und einigen Anbietern aber eine volle\n\t\t\t\t\t\t\t// Adresse. Ein blindes Voranstellen der Herkunft macht\n\t\t\t\t\t\t\t// aus der zweiten eine kaputte.\n\t\t\t\t\t\t\tbild: u.avatar_template\n\t\t\t\t\t\t\t\t? (/^https?:/.test(u.avatar_template) ? \"\" : location.origin)\n\t\t\t\t\t\t\t\t\t+ String(u.avatar_template).replace(\"{size}\", \"48\")\n\t\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"*\"\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t\t.catch(function () {\n\t\t\t\t\t// Kein Name ist besser als ein falscher.\n\t\t\t\t});\n\t\t} catch (e) {\n\t\t\t// s. o.\n\t\t}\n\t}\n\n\tfunction melde_zustand() {\n\t\t// ⚠️ Auch als Attribut am Wurzelelement, nicht nur als Nachricht. Eine\n\t\t//    `postMessage` laesst sich von aussen nicht nachsehen -- ein Attribut\n\t\t//    schon. Genau daran liess sich am 16.09.2026 unterscheiden, ob das\n\t\t//    Skript gar nicht laeuft oder ob die Nachricht haengt.\n\t\tdocument.documentElement.setAttribute(\n\t\t\t\"data-sha-zustand\",\n\t\t\tabgemeldet() ? \"abgemeldet\" : \"angemeldet\"\n\t\t);\n\n\t\ttry {\n\t\t\tif (window.parent && window.parent !== window) {\n\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t{ type: \"sha-forum-zustand\", angemeldet: !abgemeldet() },\n\t\t\t\t\t\"*\"\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Eine fremde Seite, die uns einbettet, geht uns nichts an.\n\t\t}\n\t}\n\n\timRahmenBereit(function () {\n\t\tspur(\"bereit\");\n\t\tspur(abgemeldet() ? \"abgemeldet\" : \"angemeldet\");\n\t\tmelde_zustand();\n\t\tif (!abgemeldet()) {\n\t\t\tmelde_wer();\n\t\t}\n\n\t\t// ⚠️ Der erste Anlauf fuer \"Direkt antworten\". Der Beobachter unten\n\t\t//    pflegt ihn danach weiter -- aber er feuert nur, wenn sich etwas\n\t\t//    AENDERT. Steht beim Bereitwerden schon alles, gaebe es ohne diesen\n\t\t//    Aufruf nie ein Ereignis, und der Knopf bliebe fuer immer aus.\n\t\t//    Zweimal verzoegert, weil Ember die Beitraege nachreicht.\n\t\tdirekt_pflegen();\n\t\tsetTimeout(direkt_pflegen, 800);\n\t\tsetTimeout(direkt_pflegen, 2500);\n\t});\n\n\t/**\n\t * Meldet der Seite einen Schritt des eigenen Ablaufs.\n\t *\n\t * ⚠️ Der Rahmen kann selbst nichts aufzeichnen -- er kennt die Route der\n\t * Seite nicht und ist eine fremde Herkunft. Er sagt deshalb nur, was er tut;\n\t * gesammelt und abgeschickt wird es dort drueben. Ob ueberhaupt etwas\n\t * aufgezeichnet wird, entscheidet allein die Seite.\n\t */\n\tfunction spur(was) {\n\t\ttry {\n\t\t\tif (window.parent && window.parent !== window) {\n\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t{ type: \"sha-forum-spur\", was: String(was), ry: Math.round(window.scrollY) },\n\t\t\t\t\t\"*\"\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Eine fremde Seite, die uns einbettet, geht uns nichts an.\n\t\t}\n\t}\n\n\t/** Sagt der Seite Bescheid, damit sie ihre Scrollposition festhalten kann. */\n\tfunction melde_editor() {\n\t\ttry {\n\t\t\tif (window.parent && window.parent !== window) {\n\t\t\t\twindow.parent.postMessage({ type: \"sha-forum-editor\" }, \"*\");\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Eine fremde Seite, die uns einbettet, geht uns nichts an.\n\t\t}\n\t}\n\n\t/**\n\t * Der Weg zum Anmelden fuehrt am Handy AUS dem Rahmen heraus.\n\t *\n\t * ⚠️⚠️ Warum ueberhaupt, Karim am 16.09.2026: \"wenn ich in der mobilen\n\t * Ansicht auf Anmelden klicken moechte, passiert nichts und ich werde an\n\t * den Seitenanfang geschickt.\"\n\t *\n\t * Discourses eigener Weg hat in einem 480 px hohen Rahmen drei Bruchstellen\n\t * hintereinander, und jede einzelne genuegt:\n\t *\n\t *   1. Der Klick oeffnet ein Modal, das `position: fixed` im RAHMEN ist.\n\t *      Beim Oeffnen springt der Rahmen auf `scrollTop = 0` -- das ist das\n\t *      \"an den Seitenanfang geschickt\", denn die Diskussion steht danach\n\t *      wieder beim ersten Beitrag.\n\t *   2. Der Knopf im Modal (\"Anmelde-Registerkarte oeffnen\") ist gemessen\n\t *      272 px breit in einem 279 px Rahmen und lief rechts heraus.\n\t *   3. Er ruft `window.open()` aus einem fremdstaemmigen Rahmen. Genau das\n\t *      blockieren mobile Browser am ehesten, und ohne sichtbaren Hinweis.\n\t *\n\t * Und selbst wenn alle drei halten: der Rahmen ist eine FREMDE HERKUNFT.\n\t * Ein Handy-Browser mit blockierten Drittanbieter-Cookies gibt ihm die\n\t * Forensitzung ohnehin nicht, dafuer braucht es die Storage Access API und\n\t * eine zweite Nutzergeste. Auf 279 px ist das kein Anmeldeweg mehr.\n\t *\n\t * Deshalb: ein echter Anker mit `target=\"_blank\"`. Der ist KEIN\n\t * `window.open()` und wird nicht als Popup blockiert.\n\t *\n\t * ⚠️⚠️ DAS ZIEL IST DER ANMELDEBILDSCHIRM, nicht das Thema. Der erste Anlauf\n\t * hat auf das Thema im Forum gezeigt, und Karim am 16.09.2026: \"Wenn ich\n\t * mobil jetzt auf Anmelden klicke, werde ich in die Community auf den\n\t * Beitrag geleitet und nicht zu einem Anmeldebildschirm. Auf dem Desktop\n\t * öffnet sich hingegen direkt ein entsprechendes Feld und dann wird man\n\t * richtig zur Anmeldung im Forum geleitet. Das ist besser.\"\n\t *\n\t * Gemessen, wohin Discourses eigenes Modal auf dem Desktop fuehrt -- genau\n\t * diese Adresse wird hier benutzt, damit beide Wege am selben Ort enden:\n\t *\n\t *     window.open(\"https://…/login?embed_signin_callback=1\", \"_blank\")\n\t *\n\t * ⚠️ KEIN `rel=\"noopener\"`. Das ist hier nicht vergessen, sondern der Grund,\n\t * warum `embed_signin_callback` ueberhaupt etwas bewirken kann: Discourse\n\t * meldet sich nach der Anmeldung ueber `window.opener` beim Rahmen zurueck.\n\t * Mit `noopener` gaebe es diese Verbindung nicht, und der Tab bliebe offen\n\t * stehen. Das geoeffnete Ziel ist unser eigenes Forum, nicht irgendeine\n\t * fremde Seite -- die uebliche Begruendung fuer `noopener` trifft nicht zu.\n\t *\n\t * ⚠️ Seit 0.14.0 auf JEDER Breite. Bis dahin galt das nur fuer schmale\n\t * Rahmen, weil Discourses Modal auf dem Desktop funktioniert -- es\n\t * funktioniert dort auch weiterhin, es ist nur ein Klick, der nichts\n\t * beitraegt. Wer es zurueckhaben will, laesst den Zweig `abgemeldet()` im\n\t * Klick-Behandler wieder auf `schmal()` pruefen.\n\t */\n\tfunction anmelden_ausserhalb() {\n\t\tspur(\"zur-anmeldung\");\n\n\t\t// ⚠️ Der Seite Bescheid geben, BEVOR der Tab aufgeht. Der Rahmen erfaehrt\n\t\t//    nie, dass in einem anderen Tab eine Anmeldung stattgefunden hat --\n\t\t//    die Seite merkt aber, wenn der Leser zurueckkommt, und laedt den\n\t\t//    Rahmen dann einmal neu. Karim am 16.09.2026: \"Wenn ich mich anmelde,\n\t\t//    muss ich die mobile Seite selbst neu laden, um darin antworten zu\n\t\t//    koennen. Das ist wieder viel zu aufwaendig.\"\n\t\t//\n\t\t// ⚠️ `\"*\"` als Ziel ist hier vertretbar, weil die Nachricht nichts\n\t\t//    enthaelt ausser dem Ereignis selbst. Geprueft wird auf der anderen\n\t\t//    Seite: `assets/embed.js` nimmt sie nur von unserem Forum an.\n\t\ttry {\n\t\t\tif (window.parent && window.parent !== window) {\n\t\t\t\twindow.parent.postMessage({ type: \"sha-forum-anmelden\" }, \"*\");\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// Eine fremde Seite, die uns einbettet, geht uns nichts an.\n\t\t}\n\n\t\t// ⚠️ `sha_zurueck` ist der Rueckweg. Karim am 16.09.2026: \"Kann man nach\n\t\t//    der Anmeldung direkt zurueck zum Blog leiten?\" Der Anmeldetab weiss\n\t\t//    sonst nicht, woher der Leser kam -- Discourse kennt nur sich selbst.\n\t\tvar ziel = window.location.origin + \"/login?embed_signin_callback=1\";\n\t\tif (seite) {\n\t\t\tziel += \"&sha_zurueck=\" + encodeURIComponent(seite);\n\t\t}\n\n\t\tvar a = document.createElement(\"a\");\n\t\ta.href = ziel;\n\t\ta.target = \"_blank\";\n\t\tdocument.body.appendChild(a);\n\t\ta.click();\n\t\ta.parentNode.removeChild(a);\n\t}\n\n\tfunction komposer() {\n\t\treturn document.querySelector(\".embed-mode-composer\");\n\t}\n\n\t/** Der Schliessen-Knopf, bewusst am Ende von body und nicht im Editor. */\n\tfunction knopf() {\n\t\tvar vorhanden = document.querySelector(\".sha-schliessen\");\n\t\tif (vorhanden) {\n\t\t\treturn vorhanden;\n\t\t}\n\n\t\tvar b = document.createElement(\"button\");\n\t\tb.type = \"button\";\n\t\tb.className = \"sha-schliessen\";\n\t\tb.textContent = \"×\";\n\t\tb.title = \"Antwortfeld schließen\";\n\t\tb.setAttribute(\"aria-label\", \"Antwortfeld schließen\");\n\t\tdocument.body.appendChild(b);\n\t\treturn b;\n\t}\n\n\t/**\n\t * Setzt den Knopf ueber die rechte obere Ecke des Editors.\n\t *\n\t * In Dokumentkoordinaten, nicht `fixed`: so wandert er beim Scrollen mit dem\n\t * Editor mit, statt im Bild kleben zu bleiben.\n\t */\n\tfunction knopfSetzen() {\n\t\t// ⚠️ Anker ist die SCHREIBFELD-BOX, nicht der ganze Editorbereich.\n\t\t// Dessen Oberkante liegt im ausblendenden Verlauf zum Beitrag darueber,\n\t\t// und dort verschwand das × halb (Karim, 15.09.2026). Die Box selbst hat\n\t\t// eine klare Kante, ueber der der Knopf sauber steht.\n\t\tvar ziel = document.querySelector(\".embed-mode-composer .d-editor\") || komposer();\n\t\tvar b = document.querySelector(\".sha-schliessen\");\n\t\tif (!ziel || !b) {\n\t\t\treturn;\n\t\t}\n\t\tvar r = ziel.getBoundingClientRect();\n\t\tif (r.height === 0) {\n\t\t\treturn;\n\t\t}\n\t\t// ⚠️ INNERHALB der Box, nicht darueber. Beim Antworten auf einen einzelnen\n\t\t// Beitrag zeigt Discourse ueber der Box eine eigene Kopfzeile\n\t\t// (\"Antworten auf …\") mit eigenem ×. Ueber der Box standen dann zwei ×\n\t\t// uebereinander (Karim, 15.09.2026). In der Ecke der Werkzeugleiste ist\n\t\t// rechts Platz, und es kollidiert mit nichts.\n\t\tb.style.top = Math.round(r.top + window.scrollY + 6) + \"px\";\n\t\tb.style.left = Math.round(r.right + window.scrollX - 38) + \"px\";\n\t}\n\n\t/**\n\t * Scrollt ein Element in die Mitte -- AUSSCHLIESSLICH im Rahmen.\n\t *\n\t * ⚠️⚠️ NICHT `scrollIntoView()`. Das scrollt jeden scrollbaren Vorfahren mit,\n\t *    und der aeusserste ist die ARTIKELSEITE. Karim am 16.09.2026: \"Wenn ich\n\t *    dann mobil auf Antworten klicke, springe ich wieder ganz nach oben auf\n\t *    die Seite und muss dann wieder ganz nach unten scrollen.\"\n\t *\n\t *    `window.scrollTo()` im Rahmen kann das nicht: es kennt nur das eigene\n\t *    Dokument. Die Leseposition der Seite bleibt damit, wo sie war.\n\t */\n\tfunction scrolle_im_rahmen(el) {\n\t\tvar r = el.getBoundingClientRect();\n\n\t\t// ⚠️⚠️ HIER LAG DER SPRUNG AN DEN ANFANG, und er hat drei Runden gekostet,\n\t\t//    weil dreimal woanders gesucht wurde -- bei `scrollIntoView`, bei\n\t\t//    Discourses `embed.js` und beim Browser-Fokus. Es war die Rechnung\n\t\t//    selbst, und sie ist auf zwei Arten falsch:\n\t\t//\n\t\t//    1. **`.embed-mode-composer` ist `position: sticky`.** Gemessen am\n\t\t//       16.09.2026 bei 480 px Rahmen: top 411, bottom 480 -- er steht\n\t\t//       IMMER vollstaendig im Bild, an jeder Scrollposition. Ihn \"in die\n\t\t//       Mitte zu scrollen\" heisst deshalb: bei jedem Aufruf 206 px nach\n\t\t//       unten, und weil zweimal gerufen wird, 412 px am Stueck. Ein\n\t\t//       klebendes Element einzuscrollen ist eine Jagd ohne Ende.\n\t\t//\n\t\t//    2. **Hat das Element die Hoehe 0**, und genau das ist der Fall, wenn\n\t\t//       der Editor gerade nach `#reply-control` umzieht, dann rechnet die\n\t\t//       Formel `scrollY + 0 - 240` -- also 240 px NACH OBEN, zweimal, und\n\t\t//       `Math.max(0, …)` macht daraus bei kurzem Dokument die **0**.\n\t\t//       Ein leeres Thema ist kurz. Das ist der Sprung an den Anfang.\n\t\t//\n\t\t//    ⚠️ Der urspruengliche Grund vom 15.09.2026 ist ausserdem weg: damals\n\t\t//    scrollte Discourse zu einem noch verborgenen Editor und traf ins\n\t\t//    Leere. Heute gibt unser Behandler die Klasse in der EINFANGPHASE\n\t\t//    frei, also bevor Ember ueberhaupt handelt -- Discourses eigener\n\t\t//    Sprung landet damit richtig, und wir muessen gar nicht mehr helfen.\n\t\t//\n\t\t//    Geblieben ist nur der Fall, dass etwas wirklich ausserhalb des\n\t\t//    Bildes steht. Nur dann wird gescrollt.\n\t\tif (r.height === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (r.top >= 0 && r.bottom <= window.innerHeight) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar ziel = window.scrollY + r.top - (window.innerHeight - r.height) / 2;\n\t\twindow.scrollTo(0, Math.max(0, Math.round(ziel)));\n\t}\n\n\tfunction freigeben() {\n\t\tif (!imRahmen()) {\n\t\t\treturn;\n\t\t}\n\t\tdocument.body.classList.add(KLASSE);\n\t\tspur(\"freigeben\");\n\t\tmelde_editor();\n\n\t\t// ⚠️ Mehrere Proben nach dem Freigeben. Nur so laesst sich trennen, WER\n\t\t//    springt: bewegt sich `ry` (die Scrollposition IM Rahmen), war es\n\t\t//    Discourse; bewegt sich nur `y` (die der Seite), war es der Browser\n\t\t//    oder wir. Eine einzelne Messung kann das nicht unterscheiden.\n\t\t[0, 300, 800, 1500, 2500].forEach(function (v) {\n\t\t\tsetTimeout(function () {\n\t\t\t\tspur(\"nach-freigabe-\" + v);\n\t\t\t}, v);\n\t\t});\n\n\t\t// ⚠️ Das × entsteht erst, wenn es wirklich einen Editor gibt. Sonst\n\t\t// steht ein Schliessen-Knopf ueber etwas, das gar nicht offen ist.\n\t\tif (document.querySelector(\".embed-mode-composer .d-editor\")) {\n\t\t\tknopf();\n\t\t}\n\n\t\t// ⚠️ Selbst nachscrollen. Discourses eigener Sprung erfolgt, solange der\n\t\t// Editor noch verborgen ist, und landet deshalb falsch. Zweimal, weil der\n\t\t// Editor erst nach dem Aufklappen seine endgueltige Hoehe hat.\n\t\t[90, 450].forEach(function (verzug) {\n\t\t\tsetTimeout(function () {\n\t\t\t\tvar k = komposer();\n\t\t\t\tif (k) {\n\t\t\t\t\tscrolle_im_rahmen(k);\n\t\t\t\t}\n\t\t\t\t// Der Editor entsteht erst nach dem Klick, also hier erneut pruefen.\n\t\t\t\tif (document.querySelector(\".embed-mode-composer .d-editor\")) {\n\t\t\t\t\tknopf();\n\t\t\t\t\tknopfSetzen();\n\t\t\t\t}\n\t\t\t}, verzug);\n\t\t});\n\t}\n\n\tfunction schliessen() {\n\t\tif (document.body) {\n\t\t\tdocument.body.classList.remove(KLASSE);\n\t\t}\n\t\tdirekt_pflegen();\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// ⚠️ \"Direkt antworten\" -- der Knopf, fuer den man nicht ans Ende scrollen\n\t//    muss.\n\t//\n\t//    Karim am 20.09.2026: \"In Kommentarfeldern, in denen es schon Antworten\n\t//    gibt und wir angemeldet sind, koennen wir doch vielleicht permanent\n\t//    einen 'Direkt antworten' Button unten rechts anzeigen, aehnlich wie\n\t//    beim Anmelden Button. Damit muss der Nutzer nicht ganz bis zum Ende\n\t//    scrollen.\"\n\t//\n\t//    Das Vorbild ist Discourses eigener `embed-mode-composer__signin-cta`,\n\t//    den ein ABGEMELDETER Leser unten rechts sieht. Angemeldet gibt es\n\t//    nichts Vergleichbares: der \"Antworten\"-Knopf steht im Fussbereich, und\n\t//    der liegt hinter allen Antworten.\n\t//\n\t// ⚠️ Er klickt nur den echten Knopf. Freigabe des Editors, Meldung an die\n\t//    Seite und der Anmeldeweg haengen am globalen Klickbehandler unten --\n\t//    ein zweiter Weg dorthin waere eine zweite Stelle, die man vergisst.\n\t// -------------------------------------------------------------------------\n\tvar DIREKT = \"sha-direkt-antworten\";\n\n\t/**\n\t * ⚠️⚠️ EINE EIGENE, ENGERE LISTE ALS `ANTWORT` -- UND DAS IST DER GANZE FEHLER\n\t *    VOM 20.09.2026.\n\t *\n\t *    Der Knopf nahm zuerst `document.querySelector(ANTWORT)`. Diese Liste\n\t *    enthaelt aber auch die Antwort-Knoepfe EINZELNER Beitraege\n\t *    (`.reply-to-post`, `.post-controls .reply`, `[data-action='reply']`),\n\t *    und `querySelector` liefert das erste Vorkommen im Dokument -- also\n\t *    irgendeinen Beitrag weiter oben. Discourse haengt beim Scrollen\n\t *    Beitraege ein und aus, deshalb war es jedes Mal ein anderer.\n\t *\n\t *    Karim am 20.09.2026: \"wenn ich auf direkt antworten klicke, [wird]\n\t *    immer auf eine scheinbar wechselnde Person geantwortet. Ich will ueber\n\t *    diesen Knopf aber einfach nur normal antworten.\"\n\t *\n\t *    Hier stehen deshalb nur Knoepfe aus dem FUSSBEREICH DES THEMAS. Kein\n\t *    `.btn-primary.create` ohne Elternteil: dieselbe Klasse traegt auch der\n\t *    Absende-Knopf im Composer.\n\t */\n\tvar ANTWORT_THEMA = [\n\t\t\".topic-footer-main-buttons .create\",\n\t\t\".topic-footer-main-buttons .btn-primary\",\n\t\t\".embed-topic-footer__first-reply .btn\"\n\t].join(\",\");\n\n\t// Der Kasten, in dem dieser Knopf sitzt. Gebraucht fuer die Frage \"ist der\n\t// normale Antworten-Knopf gerade im Bild?\".\n\tvar FUSS = [\n\t\t\".topic-footer-main-buttons\",\n\t\t\".topic-footer-buttons\",\n\t\t\".embed-topic-footer\"\n\t].join(\",\");\n\n\t/**\n\t * Ist der normale Antworten-Knopf im sichtbaren Bereich des Rahmens?\n\t *\n\t * Karim am 20.09.2026: \"der Knopf kann verschwinden, wenn ich ganz unten\n\t * ankomme und der 'normale' Antworten Knopf erscheint.\" Zwei Knoepfe fuer\n\t * dieselbe Handlung nebeneinander sind einer zu viel.\n\t *\n\t * ⚠️ Gerechnet wird ueber `getBoundingClientRect`, nicht mit einem\n\t * `IntersectionObserver`: der Fussbereich ist im Rahmen teilweise 0 px hoch\n\t * (gemessen 16.09.2026, siehe Abschnitt 8o), und ein leeres Rechteck ist\n\t * genau der Fall, in dem sich Beobachter uneinheitlich verhalten. Ein\n\t * Vergleich zweier Zahlen tut es auch bei Hoehe 0.\n\t */\n\tfunction fuss_element() {\n\t\tvar alle = document.querySelectorAll(FUSS + \",\" + ANTWORT_THEMA);\n\n\t\t// ⚠️⚠️ NUR ELEMENTE MIT ECHTER HOEHE, und kein Ersatz mehr.\n\t\t//\n\t\t//    Was 0 px hoch ist, sieht der Leser nicht -- es kann also auch nicht\n\t\t//    der Grund sein, den schwebenden Knopf wegzunehmen. Die erste\n\t\t//    Fassung nahm ein solches Element als Rueckfall und hat den Knopf\n\t\t//    damit an Stellen ausgeblendet, an denen gar nichts zu sehen war.\n\t\t//    Gemessen 20.09.2026: `.embed-topic-footer` ist 966 x 0 px.\n\t\tfor (var i = 0; i < alle.length; i++) {\n\t\t\tif (alle[i].getBoundingClientRect().height > 0) {\n\t\t\t\treturn alle[i];\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction fuss_im_bild() {\n\t\tvar el = fuss_element();\n\t\tif (!el) {\n\t\t\treturn false;\n\t\t}\n\t\tvar r = el.getBoundingClientRect();\n\t\treturn r.top < window.innerHeight && r.bottom > 0;\n\t}\n\n\tfunction direkt_knopf() {\n\t\tvar da = document.querySelector(\".\" + DIREKT);\n\t\tif (da) {\n\t\t\treturn da;\n\t\t}\n\n\t\tvar b = document.createElement(\"button\");\n\t\tb.type = \"button\";\n\t\tb.className = DIREKT;\n\t\tb.hidden = true;\n\t\tb.textContent = \"Direkt antworten\";\n\t\tb.addEventListener(\"click\", direkt_klick);\n\t\tdocument.body.appendChild(b);\n\t\treturn b;\n\t}\n\n\t/**\n\t * Klickt den Antworten-Knopf des THEMAS -- und beschafft ihn notfalls erst.\n\t *\n\t * ⚠️⚠️ Der Fussbereich existiert nicht immer. Discourse rendert ihn erst,\n\t *    wenn der Post-Stream nahe genug am Ende ist; mitten in einem langen\n\t *    Thema ist er nicht im Dokument. Dann hilft nur: ans Ende springen und\n\t *    warten, bis er da ist.\n\t *\n\t * ⚠️ Der Sprung ist vertretbar, weil gleich danach der Editor aufgeht und\n\t *    ohnehin die Aufmerksamkeit uebernimmt. Ohne ihn taete der Knopf nichts,\n\t *    und ein Knopf, der nichts tut, ist schlimmer als einer, der scrollt.\n\t *\n\t * ⚠️ Nach fuenf Sekunden wird aufgegeben, mit Spur. Eine Endlosschleife im\n\t *    Rahmen des Lesers waere der schlechteste aller Ausgaenge.\n\t */\n\t/**\n\t * ⚠️⚠️ DER ELEGANTE WEG: Discourses eigenen Composer aufrufen, statt einen\n\t *    Knopf zu suchen, den es noch gar nicht gibt.\n\t *\n\t *    Karim am 20.09.2026: \"das ans Ende der Diskussion springen [ist] keine\n\t *    schoene Animation. Es sieht so aus, als ob er 3 oder 4 mal nach unten\n\t *    springt und nachlaedt.\"\n\t *\n\t *    Er hat recht, und die Ursache ist der Rueckfall unten: der Post-Stream\n\t *    laedt beim Erreichen des Endes nach, die Seite wird dadurch laenger,\n\t *    und der naechste Sprung geht wieder ans neue Ende. Vier Spruenge sind\n\t *    vier Nachladerunden.\n\t *\n\t *    Der Rahmen hat aber Zugriff auf Discourses eigene Dienste. Gemessen am\n\t *    20.09.2026 im Rahmen von Thema 258:\n\t *\n\t *      require(\"discourse/lib/get-owner\").getOwnerWithFallback()\n\t *        .lookup(\"service:composer\")          -> vorhanden, mit `open()`\n\t *        .lookup(\"controller:topic\").model    -> das Thema, id 258\n\t *\n\t *    Damit oeffnet sich der Antwort-Editor **ohne jedes Scrollen**.\n\t *\n\t * ⚠️ Rueckgabe `true` heisst nur \"der Aufruf lief durch\", nicht \"der Editor\n\t *    steht\". Ob er wirklich aufging, prueft der Aufrufer danach -- und faellt\n\t *    sonst auf den alten Weg zurueck. Interne Dienste sind kein Vertrag:\n\t *    sie koennen sich mit jeder Discourse-Fassung aendern, und dann darf der\n\t *    Knopf nicht einfach tot sein.\n\t */\n\tfunction api_antworten() {\n\t\tvar go;\n\t\tvar owner;\n\n\t\ttry {\n\t\t\tgo = window.require(\"discourse/lib/get-owner\");\n\t\t\towner = (go.getOwnerWithFallback || go.getOwner)();\n\t\t} catch (err) {\n\t\t\tspur(\"direkt-api-fehlt\");\n\t\t\treturn false;\n\t\t}\n\n\t\t// ⚠️⚠️ ERSTER WEG: die Action des Themen-Controllers. Genau die haengt\n\t\t//    auch am \"Antworten\"-Knopf im Fussbereich, und sie beschafft sich\n\t\t//    Entwurfsschluessel und -folge selbst. **Ohne Argument** heisst\n\t\t//    \"antworte dem THEMA\"; mit einem Beitrag waere es wieder eine\n\t\t//    Antwort an eine Person, und genau das soll dieser Knopf nicht.\n\t\ttry {\n\t\t\towner.lookup(\"controller:topic\").send(\"replyToPost\");\n\t\t\tspur(\"direkt-api-controller\");\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tspur(\"direkt-api-controller-fehlt\");\n\t\t}\n\n\t\t// ⚠️ ZWEITER WEG: der Composer-Dienst von Hand.\n\t\t//\n\t\t//    ⚠️⚠️ `draftSequence` ist PFLICHT. Fehlt sie, wirft Discourse\n\t\t//    \"draft sequence is required\" und es passiert gar nichts -- gemessen\n\t\t//    am 20.09.2026, im Thema 258 steht dort `null`. Deshalb die 0 als\n\t\t//    letzter Rueckfall: lieber ein Entwurf ohne Vorgeschichte als ein\n\t\t//    Knopf ohne Wirkung.\n\t\ttry {\n\t\t\tvar composer = owner.lookup(\"service:composer\");\n\t\t\tvar thema = owner.lookup(\"controller:topic\").model;\n\n\t\t\tif (!composer || !thema) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar folge = thema.draft_sequence;\n\t\t\tif (folge === undefined || folge === null) {\n\t\t\t\tfolge = thema.draftSequence;\n\t\t\t}\n\t\t\tif (folge === undefined || folge === null) {\n\t\t\t\tfolge = 0;\n\t\t\t}\n\n\t\t\tcomposer.open({\n\t\t\t\taction: \"reply\",\n\t\t\t\tdraftKey: thema.draft_key || thema.draftKey || (\"topic_\" + thema.id),\n\t\t\t\tdraftSequence: folge,\n\t\t\t\ttopic: thema\n\t\t\t});\n\n\t\t\tspur(\"direkt-api-composer\");\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tspur(\"direkt-api-fehlt\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Der Rueckfall: den echten Knopf beschaffen und klicken.\n\t *\n\t * ⚠️ Das Nachladen laesst sich nicht abstellen, aber es muss niemand\n\t *    zusehen. Waehrend der Runden liegt `sha-springt` am Body und blendet\n\t *    den Beitragsstrom weich aus (Abschnitt 11 im Feld `scss`); danach geht\n\t *    es zurueck an die Leseposition. Aus vier sichtbaren Spruengen wird ein\n\t *    kurzes Ausblenden.\n\t *\n\t * ⚠️ Zurueckgescrollt wird ZWEIMAL, sofort und nach 300 ms: Discourse\n\t *    scrollt beim Oeffnen des Editors gern selbst ans Ende, und wer nur\n\t *    einmal zuruecksetzt, verliert gegen den zweiten Sprung.\n\t */\n\tfunction fuss_klicken_mit_nachladen() {\n\t\tvar zurueck = window.scrollY;\n\t\tvar bis = Date.now() + 5000;\n\n\t\tif (document.body) {\n\t\t\tdocument.body.classList.add(\"sha-springt\");\n\t\t}\n\n\t\tfunction fertig() {\n\t\t\twindow.scrollTo(0, zurueck);\n\t\t\tsetTimeout(function () {\n\t\t\t\twindow.scrollTo(0, zurueck);\n\t\t\t\tif (document.body) {\n\t\t\t\t\tdocument.body.classList.remove(\"sha-springt\");\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t}\n\n\t\t(function warte() {\n\t\t\tvar z = document.querySelector(ANTWORT_THEMA);\n\t\t\tif (z) {\n\t\t\t\tspur(\"direkt-fuss-nachgeladen\");\n\t\t\t\tz.click();\n\t\t\t\tfertig();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() < bis) {\n\t\t\t\twindow.scrollTo(0, document.body.scrollHeight);\n\t\t\t\tsetTimeout(warte, 150);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tspur(\"direkt-kein-themaknopf\");\n\t\t\tfertig();\n\t\t})();\n\t}\n\n\t/**\n\t * Klickt sich in den Antwort-Editor des THEMAS.\n\t *\n\t * Reihenfolge: der echte Knopf, wenn er ohnehin schon da ist -- dann\n\t * Discourses Composer-Dienst -- und erst zuletzt der Weg mit dem Nachladen.\n\t */\n\tfunction direkt_klick(e) {\n\t\tif (e && e.preventDefault) {\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tspur(\"direkt-antworten\");\n\n\t\t// Steht der echte Knopf schon im Dokument, ist er der ehrlichste Weg:\n\t\t// er durchlaeuft den globalen Klickbehandler mit allem, was daran haengt.\n\t\tvar sofort = document.querySelector(ANTWORT_THEMA);\n\t\tif (sofort) {\n\t\t\tsofort.click();\n\t\t\treturn;\n\t\t}\n\n\t\t// ⚠️ Beim API-Weg gibt es keinen Klick auf einen ANTWORT-Knopf, also\n\t\t//    laeuft der globale Behandler nicht -- Freigabe und Meldung an die\n\t\t//    Seite muessen hier von Hand passieren. Ohne `freigeben()` oeffnet\n\t\t//    der Editor und bleibt unsichtbar, das ist Karims altes\n\t\t//    \"es passiert nichts\".\n\t\tmelde_editor();\n\t\tfreigeben();\n\n\t\tif (api_antworten()) {\n\t\t\t// Ob er wirklich aufging, zeigt sich erst danach.\n\t\t\tsetTimeout(function () {\n\t\t\t\tif (!document.querySelector(EDITOR)) {\n\t\t\t\t\tspur(\"direkt-api-ohne-editor\");\n\t\t\t\t\tfuss_klicken_mit_nachladen();\n\t\t\t\t}\n\t\t\t}, 1200);\n\t\t\treturn;\n\t\t}\n\n\t\tfuss_klicken_mit_nachladen();\n\t}\n\n\t/**\n\t * Zeigt den Knopf genau dann, wenn er etwas nuetzt.\n\t *\n\t * ⚠️ Drei Bedingungen, und jede hat einen Grund:\n\t *   - **angemeldet**: abgemeldet zeigt Discourse selbst seinen Anmelde-CTA\n\t *     an derselben Stelle, zwei Knoepfe uebereinander waeren Unsinn.\n\t *   - **mindestens zwei Beitraege**: in einem leeren Thema steht Discourses\n\t *     \"Schreib die erste Antwort!\" mittig im Bild, da muss niemand scrollen.\n\t *     Gemessen 20.09.2026: leeres Thema 841 = 1 `.topic-post`, Thema 258 mit\n\t *     Antworten = 6.\n\t *   - **Editor noch zu**: sonst verdeckt der Knopf das Feld, in das der\n\t *     Leser gerade schreibt.\n\t */\n\tfunction direkt_pflegen() {\n\t\tif (!imRahmen() || !document.body) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar b = direkt_knopf();\n\n\t\tb.hidden = !(\n\t\t\t!abgemeldet()\n\t\t\t&& document.querySelectorAll(\".post-stream .topic-post\").length >= 2\n\t\t\t&& !document.body.classList.contains(KLASSE)\n\t\t\t// Der echte Knopf steht im Bild: dann braucht es den schwebenden nicht.\n\t\t\t&& !fuss_im_bild()\n\t\t);\n\n\t\t// ⚠️⚠️ HIER STAND EINMAL `&& !!document.querySelector(ANTWORT_THEMA)`,\n\t\t//    und genau daran ist der Knopf am 20.09.2026 ganz verschwunden.\n\t\t//\n\t\t//    Discourse rendert den Fussbereich eines Themas erst, wenn der\n\t\t//    Post-Stream nahe genug am Ende ist. Mitten in einem Thema mit 65\n\t\t//    Beitraegen gibt es ihn schlicht nicht -- die Bedingung war also\n\t\t//    fast immer falsch. Vorher fiel das nicht auf, weil die alte, weite\n\t\t//    Liste `ANTWORT` die Knoepfe EINZELNER Beitraege mitzaehlte; die\n\t\t//    sind immer da. Dieselbe Verwechslung, die vorher die falsche Person\n\t\t//    angesprochen hat, hat den Knopf hier am Leben gehalten.\n\t\t//\n\t\t//    Jetzt haengt die Anzeige nur noch an Leser und Thema, und das\n\t\t//    Beschaffen des Knopfes ist Sache von `direkt_klick()`.\n\t}\n\n\t// ⚠️ Der Knopf haengt jetzt auch an der Scrollposition, also muss das\n\t//    Scrollen ihn pflegen. Gedrosselt ueber `requestAnimationFrame`: ein\n\t//    Scroll-Ereignis feuert im Rahmen dicht an dicht, und die Pflege liest\n\t//    Layoutwerte.\n\tvar pflegeLaeuft = false;\n\n\tfunction direkt_pflegen_gedrosselt() {\n\t\tif (pflegeLaeuft) {\n\t\t\treturn;\n\t\t}\n\t\tpflegeLaeuft = true;\n\t\twindow.requestAnimationFrame(function () {\n\t\t\tpflegeLaeuft = false;\n\t\t\tdirekt_pflegen();\n\t\t});\n\t}\n\n\twindow.addEventListener(\"scroll\", direkt_pflegen_gedrosselt, { passive: true });\n\twindow.addEventListener(\"resize\", direkt_pflegen_gedrosselt);\n\n\tdocument.addEventListener(\n\t\t\"click\",\n\t\tfunction (e) {\n\t\t\tif (!imRahmen() || !e.target || !e.target.closest) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Der Schliessen-Knopf zuerst: er laege sonst selbst in der Ausloeserliste.\n\t\t\tif (e.target.closest(\".sha-schliessen\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tschliessen();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!e.target.closest(ANTWORT)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Ab hier steht fest: jemand will antworten. Was daraus folgt, haengt\n\t\t\t// an genau zwei Fragen, und an sonst nichts.\n\t\t\tif (abgemeldet()) {\n\t\t\t\t// ⚠️ SEIT 0.14.0 UEBERALL, nicht mehr nur auf schmalen Rahmen.\n\t\t\t\t//\n\t\t\t\t//    Discourses Modal (\"Wir haben keine bestehende Sitzung\n\t\t\t\t//    gefunden. Oeffne eine neue Registerkarte …\") erklaert nur,\n\t\t\t\t//    was es gleich selbst tut. Karim am 17.09.2026 am Desktop:\n\t\t\t\t//    \"Koennen wir da nicht auch direkt zum Anmeldeformular\n\t\t\t\t//    springen und diesen Zwischenschritt weglassen? Das sind ja\n\t\t\t\t//    so viele Klicks. Das will ja kein Mensch machen.\"\n\t\t\t\t//\n\t\t\t\t//    Ein Hinweisfenster, das man wegklicken muss, um dorthin zu\n\t\t\t\t//    kommen, wohin man ohnehin wollte, ist ein Klick ohne\n\t\t\t\t//    Gegenwert. Das Ziel ist auf beiden Geraeten dasselbe, also\n\t\t\t\t//    auch der Weg.\n\t\t\t\te.preventDefault();\n\t\t\t\t// ⚠️ In der Einfangphase, damit Embers eigener Behandler in der\n\t\t\t\t// Blasenphase gar nicht erst drankommt.\n\t\t\t\te.stopPropagation();\n\t\t\t\tanmelden_ausserhalb();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tspur(\"klick-antwort\");\n\n\t\t\t// ⚠️ Die Meldung an die Seite geht SOFORT raus, vor allem anderen.\n\t\t\t//    `postMessage` ist asynchron; je frueher sie losgeht, desto eher\n\t\t\t//    hat die Seite ihre Scrollposition gesichert, bevor irgendetwas\n\t\t\t//    sie verschiebt. Eine Nachricht, die nach dem Sprung ankommt,\n\t\t\t//    sichert nur noch den Sprung.\n\t\t\tmelde_editor();\n\n\t\t\t// Angemeldet: Editor freigeben. ⚠️ Ohne diesen Zweig oeffnet Ember den\n\t\t\t// Editor zwar, aber unser CSS haelt ihn auf `display: none` -- er geht\n\t\t\t// auf und ist unsichtbar. Genau das war Karims \"es passiert nichts\".\n\t\t\tfreigeben();\n\t\t\tdirekt_pflegen();\n\t\t},\n\t\ttrue\n\t);\n\n\t// -------------------------------------------------------------------------\n\t// ⚠️ \"Kommentar schreiben\" auf der Seite oeffnet hier gleich den Editor.\n\t//\n\t//    Karim am 16.09.2026: \"Ich moechte, dass das Thema wirklich erst dann\n\t//    erstellt wird, wenn wirklich jemand ein Kommentar verfasst.\"\n\t//\n\t//    Spaeter als hier geht es nicht: Discourse kann keine Antwort zu einem\n\t//    Thema annehmen, das es nicht gibt. Der letztmoegliche Zeitpunkt ist\n\t//    also \"jemand oeffnet den Editor\" -- und genau dorthin ist die Anlage\n\t//    verschoben. Die Seite haengt `sha_antworten=1` an, wenn der Leser auf\n\t//    den Knopf getippt hat; dann faellt der zweite Klick im Rahmen weg.\n\t//\n\t//    ⚠️ Nur angemeldet. Abgemeldet wuerde der Klick `anmelden_ausserhalb()`\n\t//    ausloesen -- ohne Nutzergeste, also genau das Popup, das jeder mobile\n\t//    Browser blockiert.\n\t// -------------------------------------------------------------------------\n\t/**\n\t * Oeffnet den Editor von selbst, weil der Leser auf der Seite schon gesagt\n\t * hat, dass er schreiben will.\n\t *\n\t * ⚠️ Nur einmal. Die Nachricht kann bei einem erneuten Laden des Rahmens\n\t *    wiederkommen, und zwei laufende Wartschleifen wuerden sich in die Quere\n\t *    kommen.\n\t */\n\tvar autoLaeuft = false;\n\n\t/**\n\t * ⚠️⚠️ DER VORGESCHRIEBENE KOMMENTAR, und warum er ueberhaupt hier landet.\n\t *\n\t *    Bis zum 20.09.2026 legte schon der Klick auf \"Kommentar schreiben\" ein\n\t *    Forenthema an. Es blieb `unlisted`, bis jemand antwortete -- und weil\n\t *    Discourses Neu-Zaehler fuer Staff den Sichtbarkeitsfilter weglaesst,\n\t *    zaehlten diese leeren Themen bei Karim als ungelesen mit: \"Neu (1)\"\n\t *    ueber einer leeren Liste. Zehn Stueck in drei Tagen.\n\t *\n\t *    Seither schreibt der Leser ZUERST, auf der Artikelseite, in ein eigenes\n\t *    Feld. Erst sein Absenden legt das Thema an. Der Text muss dann aber von\n\t *    dort hierher -- ein Beitrag entsteht nur im Composer, und nur unter dem\n\t *    Konto, das in DIESEM Rahmen angemeldet ist. Genau deshalb wird er\n\t *    uebertragen statt serverseitig gepostet: wir schreiben nichts im Namen\n\t *    eines Lesers, wir fuellen nur sein Feld.\n\t */\n\tvar TEXT = \"\";\n\tvar textGesetzt = false;\n\n\tvar EINGABE = [\n\t\t\"#reply-control .d-editor-input\",\n\t\t\".embed-mode-composer .d-editor-input\",\n\t\t\"textarea.d-editor-input\"\n\t].join(\",\");\n\n\tvar ABSENDEN = [\n\t\t\"#reply-control .save-or-cancel .create\",\n\t\t\"#reply-control button.create\",\n\t\t\".embed-mode-composer .create\",\n\t\t\".embed-mode-composer .save-or-cancel .btn-primary\"\n\t].join(\",\");\n\n\t/**\n\t * Setzt den mitgereisten Text in den Composer und schickt ihn ab.\n\t *\n\t * ⚠️ `value =` allein genuegt nicht. Der Composer ist an ein Ember-Modell\n\t * gebunden, das nur durch ein `input`-Ereignis mitbekommt, dass sich etwas\n\t * geaendert hat -- ohne das steht der Text sichtbar im Feld und der\n\t * Absende-Knopf bleibt trotzdem gesperrt, weil das Modell leer ist.\n\t *\n\t * ⚠️ Nur EINMAL je Rahmen (`textGesetzt`). Der Rahmen kann sich auffrischen,\n\t * und ein zweiter Durchlauf waere ein zweiter, gleicher Beitrag.\n\t */\n\tfunction text_einsetzen() {\n\t\tif (!TEXT || textGesetzt) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar bis = Date.now() + 10000;\n\n\t\t(function warte() {\n\t\t\tvar ta = document.querySelector(EINGABE);\n\t\t\tif (ta) {\n\t\t\t\ttextGesetzt = true;\n\t\t\t\tta.value = TEXT;\n\t\t\t\tta.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\t\tta.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t\t\ttry {\n\t\t\t\t\tta.focus();\n\t\t\t\t\tta.setSelectionRange(TEXT.length, TEXT.length);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Ein Feld, das keinen Cursor annimmt, ist kein Fehlschlag.\n\t\t\t\t}\n\t\t\t\tspur(\"text-eingesetzt\");\n\t\t\t\ttext_absenden();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() < bis) {\n\t\t\t\tsetTimeout(warte, 150);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tspur(\"text-kein-editor\");\n\t\t})();\n\t}\n\n\t/**\n\t * Drueckt \"Antworten\" im Composer.\n\t *\n\t * ⚠️ Das ist keine Handlung hinter dem Ruecken des Lesers: er hat auf der\n\t * Artikelseite geschrieben und dort auf \"Kommentar absenden\" getippt. Hier\n\t * wird nur sein Klick zu Ende gefuehrt.\n\t *\n\t * ⚠️ Schlaegt es fehl -- gesperrter Knopf, Ratenbremse, Spam-Pruefung --,\n\t * passiert absichtlich nichts weiter: der Composer bleibt mit dem Text offen\n\t * stehen, und der Leser drueckt selbst. Lieber ein Klick zu viel als ein\n\t * verlorener Kommentar.\n\t */\n\tfunction text_absenden() {\n\t\tvar bis = Date.now() + 10000;\n\n\t\t(function warte() {\n\t\t\tvar b = document.querySelector(ABSENDEN);\n\t\t\tif (b && !b.disabled) {\n\t\t\t\tspur(\"text-abgeschickt\");\n\t\t\t\tb.click();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() < bis) {\n\t\t\t\tsetTimeout(warte, 200);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tspur(\"text-kein-absendeknopf\");\n\t\t})();\n\t}\n\n\tfunction auto_antworten() {\n\t\tif (autoLaeuft) {\n\t\t\treturn;\n\t\t}\n\t\tautoLaeuft = true;\n\n\t\timRahmenBereit(function () {\n\t\t\t// ⚠️ Die Spur steht VOR der Entscheidung. Eine Verzweigung, von der\n\t\t\t//    man nur den einen Ast sieht, erklaert nie, warum der andere\n\t\t\t//    genommen wurde -- das hat am 16.09.2026 fuenf Runden gekostet.\n\t\t\tspur(\"auto-antworten-start\");\n\n\t\t\tif (abgemeldet()) {\n\t\t\t\tspur(\"auto-antworten-abgebrochen-abgemeldet\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ⚠️ Der Knopf entsteht erst, wenn Ember das Thema gerendert hat. Bis\n\t\t\t//    zu zehn Sekunden warten, danach bleibt eben der Knopf stehen --\n\t\t\t//    das ist immer noch besser als ein Fehler.\n\t\t\tvar bis = Date.now() + 10000;\n\n\t\t\t(function warte() {\n\t\t\t\tvar b = document.querySelector(ANTWORT);\n\t\t\t\tif (b) {\n\t\t\t\t\tspur(\"auto-antworten-klick\");\n\t\t\t\t\tb.click();\n\t\t\t\t\t// Der Editor entsteht erst durch diesen Klick, also erst\n\t\t\t\t\t// danach nach dem Eingabefeld suchen.\n\t\t\t\t\ttext_einsetzen();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (Date.now() < bis) {\n\t\t\t\t\tsetTimeout(warte, 150);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tspur(\"auto-antworten-kein-knopf\");\n\t\t\t})();\n\t\t});\n\t}\n\n\t// Der Editor waechst beim Tippen, der Knopf wandert mit.\n\twindow.addEventListener(\"resize\", knopfSetzen);\n\twindow.addEventListener(\"scroll\", knopfSetzen, { passive: true });\n\n\t// -------------------------------------------------------------------------\n\t// ⚠️⚠️ SICHERHEITSNETZ. Dreimal ist diese Freigabe an einem Selektor\n\t//    gescheitert (16.09.2026), und jedes Mal sah es fuer den Leser gleich aus:\n\t//    der Editor ging auf und blieb unsichtbar, weil unser CSS ihn ohne die\n\t//    Klasse auf `display: none` haelt. Die Liste oben ist damit tragend -- und\n\t//    eine Liste fremder CSS-Klassen ist eine schlechte Stelle zum Tragen.\n\t//\n\t//    Deshalb zusaetzlich die WIRKUNG beobachten statt nur den Ausloeser:\n\t//    erscheint ein Editor NEU im Dokument und lag kurz davor eine echte\n\t//    Nutzergeste, wird freigegeben -- ganz gleich, welcher Knopf das war.\n\t//\n\t//    ⚠️ Die Geste ist der ganze Trick. In einem Thema MIT Antworten oeffnet\n\t//    Discourse den Editor beim Laden von selbst, ohne Zutun. Genau das soll\n\t//    verborgen bleiben, das ist der Zweck der Uebung. Ohne Geste passiert\n\t//    hier also nichts.\n\t//\n\t//    ⚠️ Und nur beim ERSTEN Erscheinen. Sonst wuerde ein beim Laden\n\t//    aufgegangener Editor beim naechsten beliebigen Klick doch noch sichtbar.\n\t// -------------------------------------------------------------------------\n\tvar EDITOR = \"#reply-control .d-editor, .embed-mode-composer .d-editor\";\n\tvar letzteGeste = 0;\n\tvar editorDa = false;\n\n\tfunction geste() {\n\t\tletzteGeste = Date.now();\n\t}\n\n\tdocument.addEventListener(\"pointerdown\", geste, true);\n\tdocument.addEventListener(\"keydown\", geste, true);\n\n\tif (window.MutationObserver) {\n\t\tnew MutationObserver(function () {\n\t\t\tif (!imRahmen()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jetzt = !!document.querySelector(EDITOR);\n\n\t\t\tif (\n\t\t\t\tjetzt &&\n\t\t\t\t!editorDa &&\n\t\t\t\t!document.body.classList.contains(KLASSE) &&\n\t\t\t\tDate.now() - letzteGeste < 3000\n\t\t\t) {\n\t\t\t\tfreigeben();\n\t\t\t}\n\n\t\t\teditorDa = jetzt;\n\n\t\t\t// ⚠️ Hier und nicht in einem eigenen Intervall: der Knopf haengt an\n\t\t\t//    Dingen, die Ember rendert (Beitraege, Fussbereich), und genau\n\t\t\t//    deren Erscheinen sieht dieser Beobachter ohnehin.\n\t\t\tdirekt_pflegen();\n\t\t}).observe(document.documentElement, { childList: true, subtree: true });\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// ⚠️ DER RUECKWEG NACH DEM ANMELDEN. Karim am 16.09.2026: \"Kann man nach der\n\t//    Anmeldung direkt zurueck zum Blog leiten?\"\n\t//\n\t//    Dieser Block laeuft NICHT im Rahmen, sondern auf der Anmeldeseite des\n\t//    Forums, die wir vom Handy aus in einem neuen Tab oeffnen.\n\t//\n\t// ⚠️⚠️ ER IST HART EINGEGRENZT, und das ist keine Vorsicht auf Verdacht:\n\t//    dieses Skript laeuft auf JEDER Seite des Forums. Ohne die Pruefung auf\n\t//    `/login` UND `embed_signin_callback` wuerde es irgendwann ein Fenster\n\t//    schliessen oder umleiten, das jemand fuer etwas ganz anderes geoeffnet\n\t//    hat.\n\t//\n\t//    Erst `window.close()` versuchen -- der Tab ist aus dem Rahmen heraus\n\t//    geoeffnet, das darf der Browser zulassen, muss aber nicht (Safari ist\n\t//    strenger). Bleibt er stehen, wird stattdessen zur Blogseite umgeleitet.\n\t//    Beides fuehrt den Leser dorthin zurueck, wo er war.\n\t// -------------------------------------------------------------------------\n\tif (!imRahmen() && /^\\/login/.test(location.pathname) && location.search.indexOf(\"embed_signin_callback\") !== -1) {\n\t\t(function () {\n\t\t\tvar zurueck = \"\";\n\t\t\ttry {\n\t\t\t\tzurueck = new URLSearchParams(location.search).get(\"sha_zurueck\") || \"\";\n\t\t\t} catch (e) {\n\t\t\t\tzurueck = \"\";\n\t\t\t}\n\n\t\t\t// ⚠️ Nur auf unsere eigene Seite umleiten. Eine Adresse aus dem\n\t\t\t//    Query-String ist eine Eingabe von aussen, auch wenn wir sie\n\t\t\t//    selbst gesetzt haben.\n\t\t\tif (zurueck.indexOf(\"https://www.smarthomeassistent.de/\") !== 0) {\n\t\t\t\tzurueck = \"\";\n\t\t\t}\n\n\t\t\t// Bis zu fuenf Minuten warten -- so lange kann ein Anmeldevorgang mit\n\t\t\t// Mailbestaetigung dauern. Danach bleibt der Tab einfach stehen.\n\t\t\tvar bis = Date.now() + 300000;\n\n\t\t\t(function warte() {\n\t\t\t\tif (!abgemeldet()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\twindow.close();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Darf der Browser verweigern, dafuer gibt es den Rueckweg.\n\t\t\t\t\t}\n\t\t\t\t\tif (zurueck) {\n\t\t\t\t\t\t// ⚠️⚠️ DAS ERFOLGSZEICHEN. Dieser Zweig wird nur\n\t\t\t\t\t\t//    erreicht, wenn `abgemeldet()` FALSCH ist -- hier\n\t\t\t\t\t\t//    und nur hier steht sicher fest, dass die Anmeldung\n\t\t\t\t\t\t//    geklappt hat. Die Seite kann das selbst nie\n\t\t\t\t\t\t//    feststellen (fremde Herkunft), und sie hat es bis\n\t\t\t\t\t\t//    zum 20.09.2026 schlicht ANGENOMMEN: wer vom\n\t\t\t\t\t\t//    Anmeldeweg zurueckkam, galt als angemeldet. Wer\n\t\t\t\t\t\t//    abgebrochen hat, bekam trotzdem ein Forenthema.\n\t\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\t\tlocation.href = zurueck\n\t\t\t\t\t\t\t\t+ (zurueck.indexOf(\"#\") === -1 ? \"\" : \"\")\n\t\t\t\t\t\t\t\t+ \"#sha-angemeldet\";\n\t\t\t\t\t\t}, 300);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (Date.now() < bis) {\n\t\t\t\t\tsetTimeout(warte, 400);\n\t\t\t\t}\n\t\t\t})();\n\t\t})();\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// BLOG UND FORUM IM SELBEN TAB. Karim am 25.10.2026: \"Das Forum soll sich im\n\t//    selben Tab oeffnen, wie der Blog ist. Also es als eine Einheit\n\t//    betrachten.\" Die Website schickt Forum-Links seit SHA Seite 0.30.31 in\n\t//    denselben Tab, hier kommen die beiden Wege zurueck dazu. Befund 8bp.\n\t//\n\t// ⚠️⚠️ NIE IM RAHMEN. Im eingebetteten Kommentarbereich ist das hier auch\n\t//    das Forum. \"Zum Blog\" haette dort nichts zu suchen, und ein Link im\n\t//    selben Fenster wuerde den Artikel IM Kommentarkasten laden.\n\t// -------------------------------------------------------------------------\n\n\t// 1. Links aus Forenbeitraegen auf den Blog. Discourse oeffnet sie in einem\n\t//    neuen Tab, weil `default_other_external_links_in_new_tab` an ist. Die\n\t//    Einstellung umzulegen genuegt nicht: sie ist nur die Vorgabe fuer NEUE\n\t//    Konten, jedes bestehende traegt sie als eigene Benutzeroption.\n\t//\n\t// ⚠️ Der Abfang laeuft in der Einfangphase am Dokument und haelt Discourses\n\t//    Klickverfolgung damit auf. Die Zaehlung (\"Link 134 Mal angeklickt\")\n\t//    schicken wir deshalb selbst, genau wie Discourse per `sendBeacon` an\n\t//    `/clicks/track`. Strg-, Cmd-, Umschalt- und Mittelklick bleiben\n\t//    unberuehrt: wer bewusst einen neuen Tab will, bekommt ihn.\n\tvar BLOG = /^https:\\/\\/www\\.smarthomeassistent\\.de(\\/|$)/;\n\n\t// 0. Im Browser bleiben (Karim 27.10.2026: „Home im Forum öffnet die App … Gleich das an den Blog an“). Ein Tipp vom\n\t//    Forum auf den Blog wechselt die Domain, und iOS gibt Links auf www dann an die installierte App (universeller\n\t//    Link); innerhalb des Blogs passiert das nicht. Das Anhängsel `#web` nimmt die Apple-Datei der Website davon aus\n\t//    (Plugin SHA App, class-sha-app-wellknown.php, ab 0.3.10). Nur außerhalb der App, nie mit eigenem Anker.\n\tvar IN_APP = /SHA-App\\//.test(navigator.userAgent);\n\n\tfunction zum_blog(url) {\n\t\treturn IN_APP || url.indexOf(\"#\") !== -1 ? url : url + \"#web\";\n\t}\n\n\t// Kopf, Seitenleiste, Fußzeile und MSA: die Adresse wird vor dem Seitenwechsel getauscht.\n\t// Blog-Links öffnen immer im selben Tab (Karim 04.11.2026: Impressum und Datenschutz „öffnen immer noch in einem\n\t// neuen Tab“). Discourse setzt bei angemeldeten Konten mit „Externe Links in neuem Tab“ (Voreinstellung\n\t// `default_other_external_links_in_new_tab`) in der Seitenleiste target=\"_blank\"; der Blog gilt hier nicht als extern.\n\tdocument.addEventListener(\"click\", function (e) {\n\t\tvar a = e.target && e.target.closest ? e.target.closest(\"a[href]\") : null;\n\t\tif (imRahmen() || !a || !BLOG.test(a.href)) {\n\t\t\treturn;\n\t\t}\n\t\tif (a.href !== zum_blog(a.href)) {\n\t\t\ta.href = zum_blog(a.href);\n\t\t}\n\t\tif (a.target === \"_blank\") {\n\t\t\ta.target = \"_self\";\n\t\t}\n\t}, true);\n\n\tdocument.addEventListener(\"click\", function (e) {\n\t\tif (imRahmen() || e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n\t\t\treturn;\n\t\t}\n\t\tvar a = e.target && e.target.closest ? e.target.closest(\"a[href]\") : null;\n\t\tif (!a || !BLOG.test(a.href)) {\n\t\t\treturn;\n\t\t}\n\t\tvar gekocht = a.closest(\".cooked\");\n\t\tif (!gekocht) {\n\t\t\t// Seitenleiste und Kopf oeffnen schon im selben Tab.\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\ttry {\n\t\t\tvar beitrag = a.closest(\"[data-post-id]\");\n\t\t\tvar thema = /\\/t\\/(?:[^\\/]+\\/)?(\\d+)/.exec(location.pathname);\n\t\t\tvar daten = new FormData();\n\t\t\tdaten.append(\"url\", a.href);\n\t\t\tif (beitrag) {\n\t\t\t\tdaten.append(\"post_id\", beitrag.getAttribute(\"data-post-id\"));\n\t\t\t}\n\t\t\tif (thema) {\n\t\t\t\tdaten.append(\"topic_id\", thema[1]);\n\t\t\t}\n\t\t\tnavigator.sendBeacon(\"/clicks/track\", daten);\n\t\t} catch (err) {\n\t\t\t// Ohne Zaehlung ist der Klick trotzdem richtig.\n\t\t}\n\n\t\tlocation.href = a.href;\n\t}, true);\n\n\t// 2. Logo und „Mein SmarthomeAssistent“ wie im Blog (Karim 27.10.2026: „Muesste im Forum unser Logo nicht auch auf\n\t//    unseren Blog verweisen?“ und „Ebenfalls muesste dann im Forum unser MSA Button zur Verfuegung stehen“, Ziel:\n\t//    Blog und Forum als eine Seite). Bis 27.10.2026 stand hier „Zum Blog“, zuerst als Text, dann als Haus-Knopf;\n\t//    beides ist mit dem Logo als Weg zur Blog-Startseite ueberfluessig geworden. Die Forum-Startseite erreicht man\n\t//    ueber „Community-Forum“ im Menue (4.) bzw. „Startseite“ in der Seitenleiste.\n\t//\n\t// Am Handy (`html.mobile-view`) bleibt das Logo bei Discourses \"/\" (Karim 30.10.2026, Konzept 1: „wenn ich auf unser\n\t// Logo klicke, lande ich auf dem Blog … Mobil hat man nicht so leicht die Moeglichkeit wieder zurueck zu kommen“).\n\t// Regel dahinter: das Logo fuehrt zur Startseite dessen, was der Kopf zeigt. Am Desktop steht das Blog-Menue neben dem\n\t// Logo, am Handy nicht. Zum Blog geht es dort ueber Burger › Blog › „SmarthomeAssistent“.\n\t// ⚠️ Nie an `sha-blogmenue-eng` haengen: die Klasse springt in Themen beim Scrollen um, das Logo wechselte dann\n\t//    mitten im Lesen sein Ziel. `mobile-view` steht je Seitenaufruf fest (Discourse waehlt sie nach dem Geraet).\n\t//\n\t// ⚠️ Logo: Discourse zeichnet den Link selbst (Ember, href \"/\"). Die Adresse wird nachgesetzt (fuer Mittelklick und\n\t//    Vorschau), der Klick in der Einfangphase abgefangen, bevor Ember ihn als Seitenwechsel im Forum behandelt.\n\t// ⚠️ MSA: wie im Blog fuehrt der Knopf auf die Seite „Mein SmarthomeAssistent“ (im Blog faengt das Leserkonto den\n\t//    Klick auf das Symbol ab, gemessen 27.10.2026). Die Zahl der Smart Alarme samt Treffer und Funke kommt seit\n\t//    11.11.2026 aus dem Keks `sha_lk_glocke` (Leserkonto 0.9.203, siehe msa_zahl unten).\n\tvar BLOG_START = \"https://www.smarthomeassistent.de/\";\n\tvar MSA = '<a class=\"sha-msa\" href=\"https://www.smarthomeassistent.de/mein-smarthomeassistent/\" title=\"Mein SmarthomeAssistent\" aria-label=\"Mein SmarthomeAssistent\">'\n\t\t+ '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M1.8 11.6 12 2.6l10.2 9\" stroke-width=\"1.75\"/>'\n\t\t+ '<g stroke-width=\"1.6\"><circle cx=\"12\" cy=\"10.9\" r=\"3\"/><path d=\"M6.4 21.2a5.6 5.6 0 0 1 11.2 0z\"/></g></svg></a>';\n\n\tfunction logo_link() {\n\t\treturn document.querySelector(\".d-header .home-logo-wrapper-outlet a, .d-header .title a\");\n\t}\n\n\tfunction logo_zum_blog() {\n\t\treturn !document.documentElement.classList.contains(\"mobile-view\");\n\t}\n\n\tdocument.addEventListener(\"click\", function (e) {\n\t\tif (imRahmen() || !logo_zum_blog() || e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {\n\t\t\treturn;\n\t\t}\n\t\tvar l = logo_link();\n\t\tif (l && e.target && l.contains(e.target)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tlocation.href = zum_blog(BLOG_START);\n\t\t}\n\t}, true);\n\n\tfunction logo_und_msa() {\n\t\tif (imRahmen()) {\n\t\t\treturn;\n\t\t}\n\t\tvar l = logo_link();\n\t\tif (l && logo_zum_blog() && l.getAttribute(\"href\") !== BLOG_START) {\n\t\t\tl.setAttribute(\"href\", BLOG_START);\n\t\t\tl.setAttribute(\"title\", \"Zur Startseite von SmarthomeAssistent\");\n\t\t}\n\t\tvar panel = document.querySelector(\".d-header .panel\");\n\t\tvar da = document.querySelector(\".d-header .sha-msa\");\n\t\tif (!panel || (da && da.parentNode === panel)) {\n\t\t\treturn;\n\t\t}\n\t\tif (da) {\n\t\t\tda.parentNode.removeChild(da);\n\t\t}\n\t\tvar sch = panel.querySelector(\".sha-dm-schalter\");\n\t\tif (sch) {\n\t\t\tsch.insertAdjacentHTML(\"afterend\", MSA);\n\t\t} else {\n\t\t\tpanel.insertAdjacentHTML(\"afterbegin\", MSA);\n\t\t}\n\t}\n\n\t// 2a. Zahl am MSA-Knopf wie im Blog-Kopf (Karim 11.11.2026: „die Zahl von den Alarmen im Forum gar nicht an dem Haus“).\n\t//    Das Forum sieht den lokalen Speicher des Blogs nicht; das Leserkonto (lk.js, glockeZahl) schreibt deshalb denselben\n\t//    Stand zusaetzlich als Keks auf die ganze Domain: „Anzahl.Treffer.laut“, nur Zahlen. Treffer: Figur hellgruen und\n\t//    Zahl hellgruen; laut (Treffer noch nicht stumm geschaltet): die Zahl springt und sprueht Funken, wie im Blog.\n\t//    Ein Klick mit Treffer fuehrt wie im Blog direkt zu den Treffern (#zuschlagen).\n\t//    Neu gelesen bei jedem Kopf-Umbau und wenn der Tab wieder sichtbar wird (Stumm schalten im Blog-Tab).\n\tvar MSA_ZIEL = \"https://www.smarthomeassistent.de/mein-smarthomeassistent/\";\n\n\tfunction msa_zahl() {\n\t\tvar a = document.querySelector(\".d-header .sha-msa\");\n\t\tif (!a) {\n\t\t\treturn;\n\t\t}\n\t\tvar m = /(?:^|;\\s*)sha_lk_glocke=(\\d+)\\.([01])\\.([01])/.exec(document.cookie);\n\t\tvar n = m ? parseInt(m[1], 10) : 0;\n\t\tvar t = !!(m && n && m[2] === \"1\");\n\t\tvar l = !!(t && m[3] === \"1\");\n\t\tvar stand = n + \".\" + (t ? 1 : 0) + \".\" + (l ? 1 : 0);\n\t\tif (a.getAttribute(\"data-zahl\") === stand) {\n\t\t\treturn;\n\t\t}\n\t\ta.setAttribute(\"data-zahl\", stand);\n\t\tvar z = a.querySelector(\".sha-msa-zahl\");\n\t\tif (!z) {\n\t\t\ta.insertAdjacentHTML(\"beforeend\", '<span class=\"sha-msa-zahl\" aria-hidden=\"true\"></span><span class=\"sha-msa-funke\" aria-hidden=\"true\"></span>');\n\t\t\tz = a.querySelector(\".sha-msa-zahl\");\n\t\t}\n\t\tz.textContent = n > 99 ? \"99+\" : String(n);\n\t\tz.hidden = !n;\n\t\ta.classList.toggle(\"is-treffer\", t);\n\t\ta.classList.toggle(\"is-laut\", l);\n\t\ta.setAttribute(\"href\", t ? MSA_ZIEL + \"#zuschlagen\" : MSA_ZIEL);\n\t\ta.setAttribute(\"aria-label\", t ? \"Mein SmarthomeAssistent: Wunschpreis erreicht\" : \"Mein SmarthomeAssistent\");\n\t}\n\n\tdocument.addEventListener(\"visibilitychange\", function () {\n\t\tif (!document.hidden) {\n\t\t\tmsa_zahl();\n\t\t}\n\t});\n\n\t// 3. Darkmode-Schalter im Kopf, vorn in den Knoepfen rechts (danach MSA), dieselbe Form wie im Blog-Kopf (Feld `scss`,\n\t//    `.sha-dm-schalter`). Umschalten und Merken: window.shaForumFarbe (erstes Skript dieser Datei).\n\t//    Nicht im Rahmen: dort folgt die Farbe der Seite, auf der der Rahmen steht.\n\tvar SCHALTER = '<button type=\"button\" class=\"sha-dm-schalter\" role=\"switch\" aria-label=\"Dunkles Design\" title=\"Dunkles Design\">'\n\t\t+ '<svg class=\"sha-dm-sonne\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/></svg>'\n\t\t+ '<svg class=\"sha-dm-mond\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z\"/></svg></button>';\n\n\tfunction dm_schalter() {\n\t\tvar F = window.shaForumFarbe;\n\t\tvar da = document.querySelector(\".d-header .sha-dm-schalter\");\n\t\tvar panel = document.querySelector(\".d-header .panel\");\n\t\tif (imRahmen() || !F || !panel || !document.querySelector(\"link.dark-scheme\")) {\n\t\t\treturn;\n\t\t}\n\t\tif (da && da.parentNode === panel) {\n\t\t\treturn;\n\t\t}\n\t\tif (da) {\n\t\t\tda.parentNode.removeChild(da);\n\t\t}\n\t\tpanel.insertAdjacentHTML(\"afterbegin\", SCHALTER);\n\t\tpanel.querySelector(\".sha-dm-schalter\").addEventListener(\"click\", function (e) {\n\t\t\te.preventDefault();\n\t\t\tF.setzen(!F.dunkel);\n\t\t});\n\t\tF.anwenden();\n\t}\n\n\t// 4. Blog-Menue im Kopf (Karim 27.10.2026: „Bau Variante B: das Blog-Menue im Forum-Kopf.“). Dieselben Punkte wie\n\t//    die oberste Ebene des Blog-Hauptmenues (WordPress-Menue 251), „Community-Forum“ ist aktiv. Steht direkt hinter\n\t//    dem Logo. Passt es nicht neben die Knoepfe rechts (gemessen, nicht an einer festen Breite), bekommt <html> die\n\t//    Klasse `sha-blogmenue-eng`: das Menue verschwindet, und der Abschnitt „Blog“ der Seitenleiste (Discourse,\n\t//    Abschnitt 5, am Handy hinter dem Burger) uebernimmt die Punkte. Zur Blog-Startseite fuehrt dann das Logo (2.).\n\t// ⚠️ Die Liste zwischen den Markierungen schreibt `forum-menue.py` aus dem Blog-Menue, nie von Hand aendern.\n\t// MENUE-ANFANG\n\tvar BLOG_MENUE = [\n\t\t[\"News\", \"https://www.smarthomeassistent.de/news/\", true],\n\t\t[\"Tests\", \"https://www.smarthomeassistent.de/test/\", true],\n\t\t[\"Ratgeber\", \"https://www.smarthomeassistent.de/anleitungen-wissenswertes/\", true],\n\t\t[\"Deals\", \"https://www.smarthomeassistent.de/deals/\", true],\n\t\t[\"Finder\", \"https://www.smarthomeassistent.de/finder-tools/\", true],\n\t\t[\"Videos\", \"https://www.smarthomeassistent.de/youtube-video/\", false]\n\t];\n\t// MENUE-ENDE\n\n\t// Desktop-Ansicht ab 800 px: der Kopf ist dort Strich fuer Strich der Blog-Kopf (Feld `scss`, Abschnitt 1b).\n\tfunction kopf_wie_blog() {\n\t\treturn window.matchMedia(\"(min-width: 800px)\").matches && !document.documentElement.classList.contains(\"mobile-view\");\n\t}\n\n\t// Linke Kante des ersten sichtbaren Kopf-Symbols. Die Liste `.d-header-icons` steht per `display: contents` direkt in\n\t// der Leiste, ihre Eintraege zaehlen also einzeln; bei der Lupe zaehlt das Zeichen, nicht der Knopf (wie im Blog).\n\t// ⚠️ Anders als im Blog (Symbole fest rechts, absolut gesetzt) schiebt ein zu breites Menue die Knoepfe hier nach rechts\n\t//    aus dem Bild. Gemessen wird deshalb dort, wo sie rechtsbuendig stuenden: um den Ueberhang zurueckgerechnet.\n\tfunction symbol_links(panel) {\n\t\tvar links = Infinity;\n\t\tvar inhalt = panel.parentNode.getBoundingClientRect().right;\n\t\tvar ueber = Math.max(0, panel.getBoundingClientRect().right - inhalt);\n\t\tvar el = panel.querySelectorAll(\":scope > *, :scope > .d-header-icons > li\");\n\t\tfor (var i = 0; i < el.length; i++) {\n\t\t\tif (el[i].classList.contains(\"d-header-icons\") || el[i].classList.contains(\"header-buttons\") && !el[i].firstElementChild) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar ziel = el[i].classList.contains(\"search-dropdown\") && el[i].querySelector(\".d-icon\") || el[i];\n\t\t\tvar r = ziel.getBoundingClientRect();\n\t\t\tif (r.width > 0) {\n\t\t\t\tlinks = Math.min(links, r.left - ueber);\n\t\t\t}\n\t\t}\n\t\treturn links;\n\t}\n\n\t// Die Rechnung aus SHA Seite optik.js, gleiche Zahlen. Gibt false zurueck, wenn das Menue auch ganz eng nicht passt.\n\tfunction wie_blog_einpassen(nav, panel) {\n\t\tvar ZIEL = 14;\n\t\tvar STUFEN = [[\"luft\", 7], [\"schrift\", 12], [\"luft\", 4], [\"schrift\", 11]];\n\t\tvar p = nav.querySelectorAll(\"a\");\n\t\tif (!p.length) {\n\t\t\treturn true;\n\t\t}\n\t\tfunction messen() {\n\t\t\tvar letzter = p[p.length - 1], s = getComputedStyle(letzter), r = letzter.getBoundingClientRect(), text = 0;\n\t\t\tfor (var i = 0; i < p.length; i++) {\n\t\t\t\tvar si = getComputedStyle(p[i]);\n\t\t\t\ttext += p[i].getBoundingClientRect().width - parseFloat(si.paddingLeft) - parseFloat(si.paddingRight);\n\t\t\t}\n\t\t\tvar links = symbol_links(panel);\n\t\t\treturn {\n\t\t\t\tluecke: Math.min(links - (r.right - parseFloat(s.paddingRight)), links - r.right + ZIEL - 2),\n\t\t\t\tluft: parseFloat(s.paddingRight),\n\t\t\t\tschrift: parseFloat(s.fontSize),\n\t\t\t\tpolster: 2 * p.length - 1,\n\t\t\t\ttext: text\n\t\t\t};\n\t\t}\n\t\tvar m = messen();\n\t\tif (m.luecke >= ZIEL) {\n\t\t\treturn true;\n\t\t}\n\t\tvar luft = m.luft, schrift = m.schrift;\n\t\tfor (var runde = 0; runde < 4 && m.luecke < ZIEL; runde++) {\n\t\t\tvar fehlt = ZIEL - m.luecke + 0.25 * runde;\n\t\t\tfor (var i = 0; i < STUFEN.length && fehlt > 0; i++) {\n\t\t\t\tvar art = STUFEN[i][0], grenze = STUFEN[i][1];\n\t\t\t\tif (art === \"luft\" && luft > grenze) {\n\t\t\t\t\tvar l = Math.max(grenze, luft - fehlt / m.polster);\n\t\t\t\t\tfehlt -= (luft - l) * m.polster;\n\t\t\t\t\tluft = l;\n\t\t\t\t} else if (art === \"schrift\" && schrift > grenze) {\n\t\t\t\t\tvar f = Math.max(grenze, schrift * (1 - fehlt / m.text));\n\t\t\t\t\tfehlt -= m.text * (1 - f / schrift);\n\t\t\t\t\tm.text *= f / schrift;\n\t\t\t\t\tschrift = f;\n\t\t\t\t}\n\t\t\t}\n\t\t\tluft = Math.floor(luft * 4) / 4;\n\t\t\tschrift = Math.floor(schrift * 4) / 4;\n\t\t\tnav.style.setProperty(\"--sha-menue-luft\", luft + \"px\");\n\t\t\tnav.style.setProperty(\"--sha-menue-schrift\", schrift + \"px\");\n\t\t\tm = messen();\n\t\t}\n\t\t// Im Blog bleibt das Menue auch dann stehen, wenn die Luecke knapp unter 14 px liegt; nur wenn es die Symbole\n\t\t// beruehrt, geht es hier in die Zeile darunter.\n\t\tif (m.luecke >= 2) {\n\t\t\treturn true;\n\t\t}\n\t\tnav.style.removeProperty(\"--sha-menue-luft\");\n\t\tnav.style.removeProperty(\"--sha-menue-schrift\");\n\t\treturn false;\n\t}\n\n\t// Burger in einer eigenen Zeile unter dem Logo statt im Kopf (Karim 27.10.2026: „an aller erste Stelle das\n\t// Hamburgermenü in eine eigene Zeile … unter unserem Logo ist ja auch massig Platz dafür, wenn die Sidebar eingeklappt\n\t// ist“; danach: „Das muss an einer Stelle bleiben“). Ab 800 px (Desktop-Ansicht) ist der Kopf-Knopf immer aus (Feld\n\t// `scss`); er bleibt im Markup, denn Discourse steuert damit die Seitenleiste, und unser Knopf löst ihn aus.\n\t// Bauart: EIN Knopf, einmal an `body` gehängt und danach nie mehr umgehängt, fest positioniert (`position: fixed`, oben\n\t// 18 px unter dem Kopf). `left` ist die Symbolkante der OFFENEN Seitenleiste, gerechnet aus Discourses eigenen Maßen,\n\t// damit er offen und eingeklappt auf denselben Pixel steht: der Behälter `#main-outlet-wrapper` ist offen\n\t// `--d-max-width` + `--d-sidebar-width` breit und mittig (1920 px: 1416, ab x 252), die Seitenleiste beginnt nach seinem\n\t// Innenabstand (12,06), Einträge und Knopf haben je 9 px Einzug. Offen reserviert das Feld `scss` die erste Zeile der\n\t// Seitenleiste; weil die Seitenleiste beim Scrollen stehen bleibt, bleibt der Knopf darin.\n\t// ⚠️ Zwei frühere Fassungen hingen den Knopf je nach Zustand um (in die Seitenleiste bzw. vor den Behälter): das sprang bei\n\t// breiten Fenstern nach ganz links (feste Kante 21 px stimmte nur bis rund 1416 px) und verschluckte echte Mausklicks,\n\t// solange das Umhängen lief (27.10.2026).\n\tfunction burger_links() {\n\t\tvar rahmen = document.querySelector(\"#main-outlet-wrapper\");\n\t\tif (!rahmen) {\n\t\t\treturn null;\n\t\t}\n\t\tvar probe = document.createElement(\"div\");\n\t\tprobe.style.cssText = \"position:absolute;visibility:hidden;height:0;width:calc(var(--d-max-width) + var(--d-sidebar-width));font-size:\" + getComputedStyle(rahmen).fontSize;\n\t\tdocument.body.appendChild(probe);\n\t\tvar breit = probe.offsetWidth;\n\t\tdocument.body.removeChild(probe);\n\t\tvar fenster = document.documentElement.clientWidth;\n\t\treturn Math.round(Math.max(0, (fenster - breit) / 2) + parseFloat(getComputedStyle(rahmen).paddingLeft) + 9);\n\t}\n\n\tvar burger_breite = 0;\n\tfunction burger_zeile() {\n\t\tvar b = document.querySelector(\".sha-burger\");\n\t\tvar kopf = document.querySelector(\".d-header .header-sidebar-toggle button\");\n\t\tif (imRahmen() || !kopf_wie_blog() || !kopf) {\n\t\t\tif (b) {\n\t\t\t\tb.parentNode.removeChild(b);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (!b) {\n\t\t\tb = document.createElement(\"button\");\n\t\t\tb.type = \"button\";\n\t\t\tb.className = \"sha-burger\";\n\t\t\tvar zeichen = kopf.querySelector(\"svg\");\n\t\t\tif (zeichen) {\n\t\t\t\tb.appendChild(zeichen.cloneNode(true));\n\t\t\t}\n\t\t\tb.addEventListener(\"click\", function () {\n\t\t\t\tvar k = document.querySelector(\".d-header .header-sidebar-toggle button\");\n\t\t\t\tif (k) {\n\t\t\t\t\tk.click();\n\t\t\t\t}\n\t\t\t\tsetTimeout(burger_zeile, 0);\n\t\t\t});\n\t\t\tdocument.body.appendChild(b);\n\t\t}\n\t\t// Nur schreiben, was sich ändert: `left` und `title` sind Attribute, keine Kinder, und lösen den Beobachter nicht aus.\n\t\t// Echte Kopfhöhe samt unserer Menüzeile (`.sha-blogmenue-zeile`, Gäste bis 940 px: 97 statt 56 px). Discourses\n\t\t// `--header-offset` kennt die Zeile nicht; Burger und Seitenleiste richten sich nach `--sha-kopf-hoehe` (Feld `scss`).\n\t\tvar kopfwrap = document.querySelector(\".d-header-wrap\");\n\t\tif (kopfwrap) {\n\t\t\tvar hoehe = kopfwrap.offsetHeight + \"px\";\n\t\t\tif (document.documentElement.style.getPropertyValue(\"--sha-kopf-hoehe\") !== hoehe) {\n\t\t\t\tdocument.documentElement.style.setProperty(\"--sha-kopf-hoehe\", hoehe);\n\t\t\t}\n\t\t}\n\t\tvar fenster = document.documentElement.clientWidth;\n\t\tif (fenster !== burger_breite || !b.style.left) {\n\t\t\tvar x = burger_links();\n\t\t\tif (x !== null) {\n\t\t\t\tb.style.left = x + \"px\";\n\t\t\t\tburger_breite = fenster;\n\t\t\t}\n\t\t}\n\t\tvar wort = document.body.classList.contains(\"has-sidebar-page\") ? \"Seitenleiste einklappen\" : \"Seitenleiste ausklappen\";\n\t\tif (b.title !== wort) {\n\t\t\tb.title = wort;\n\t\t\tb.setAttribute(\"aria-label\", wort);\n\t\t}\n\t}\n\n\tfunction blog_menue() {\n\t\tvar d = document.documentElement;\n\t\tvar nav = document.querySelector(\".d-header .sha-blogmenue\");\n\t\tif (imRahmen()) {\n\t\t\tif (nav) {\n\t\t\t\tnav.parentNode.removeChild(nav);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tvar logo = document.querySelector(\".d-header .home-logo-wrapper-outlet\");\n\t\tvar panel = document.querySelector(\".d-header .panel\");\n\t\tif (!logo || !panel) {\n\t\t\treturn;\n\t\t}\n\t\tif (!nav || nav.previousElementSibling !== logo) {\n\t\t\tif (nav) {\n\t\t\t\tnav.parentNode.removeChild(nav);\n\t\t\t}\n\t\t\tvar html = '<nav class=\"sha-blogmenue\" aria-label=\"Blog\">';\n\t\t\tfor (var i = 0; i < BLOG_MENUE.length; i++) {\n\t\t\t\thtml += '<a href=\"' + BLOG_MENUE[i][1] + '\"' + (BLOG_MENUE[i][2] ? ' class=\"mit-unter\"' : '') + '>'\n\t\t\t\t\t+ BLOG_MENUE[i][0] + '</a>';\n\t\t\t}\n\t\t\thtml += '<a class=\"ist-an\" href=\"/\" aria-current=\"page\">Community-Forum</a></nav>';\n\t\t\tlogo.insertAdjacentHTML(\"afterend\", html);\n\t\t\tnav = logo.nextElementSibling;\n\t\t}\n\t\t// Platz messen: Menue einblenden, rechte Kante gegen die linke Kante der Knoepfe stellen, dann entscheiden.\n\t\t// Beides im selben Durchlauf, also ohne sichtbares Springen.\n\t\t// Ab 800 px (Desktop-Ansicht) dieselbe Rechnung wie im Blog (SHA Seite optik.js, „Hauptmenü weicht den\n\t\t// Kopfsymbolen“, Karim 27.10.2026: keine Spruenge zwischen Blog und Forum): erst Luft auf 7, Schrift auf 12, Luft auf\n\t\t// 4, Schrift auf 11, bis zwischen Text-Ende und erstem Symbol 14 px bleiben. Erst wenn auch das nicht reicht, kommt\n\t\t// die Zeile darunter. Darunter (Handy) die drei Stufen vom 27.10.2026: volle Groesse, kompakt, sonst Seitenleiste.\n\t\td.classList.remove(\"sha-blogmenue-eng\", \"sha-blogmenue-kompakt\", \"sha-blogmenue-aus\");\n\t\tnav.style.removeProperty(\"--sha-menue-luft\");\n\t\tnav.style.removeProperty(\"--sha-menue-schrift\");\n\t\tvar zeile = document.querySelector(\".d-header .two-rows, .d-header .extra-info-wrapper\");\n\t\tfunction passt() {\n\t\t\treturn nav.offsetWidth > 0 && nav.getBoundingClientRect().right <= panel.getBoundingClientRect().left - 12;\n\t\t}\n\t\tvar stufe = \"voll\";\n\t\tif (zeile) {\n\t\t\tstufe = \"eng\";\n\t\t} else if (kopf_wie_blog()) {\n\t\t\tstufe = wie_blog_einpassen(nav, panel) ? \"voll\" : \"eng\";\n\t\t} else if (!passt()) {\n\t\t\td.classList.add(\"sha-blogmenue-kompakt\");\n\t\t\tstufe = passt() ? \"kompakt\" : \"eng\";\n\t\t\tif (stufe === \"eng\") {\n\t\t\t\td.classList.remove(\"sha-blogmenue-kompakt\");\n\t\t\t}\n\t\t}\n\t\t// Passt es nicht in die Kopfzeile, steht es ab 700 px als eigene schmale Zeile direkt unter dem Kopf (Duo aufgeklappt,\n\t\t// Tablets); darunter (Handy) im Abschnitt „Blog“ der Seitenleiste. Die Zeile haengt in .d-header-wrap, Discourse misst\n\t\t// dessen Hoehe fuer --header-offset selbst nach, der Inhalt rueckt also mit.\n\t\tvar reihe = document.querySelector(\".d-header-wrap > .sha-blogmenue-zeile\");\n\t\tvar wrap = document.querySelector(\".d-header-wrap\");\n\t\tvar alsZeile = stufe === \"eng\" && !zeile && window.innerWidth >= 700 && !!wrap;\n\t\tif (alsZeile && !reihe) {\n\t\t\twrap.insertAdjacentHTML(\"beforeend\", '<nav class=\"sha-blogmenue-zeile\" aria-label=\"Blog\">' + nav.innerHTML + '</nav>');\n\t\t}\n\t\td.classList.toggle(\"sha-blogmenue-zeile-an\", alsZeile);\n\t\td.classList.toggle(\"sha-blogmenue-eng\", stufe === \"eng\" && !alsZeile);\n\t\td.classList.toggle(\"sha-blogmenue-aus\", stufe === \"eng\");\n\t}\n\n\t// 5. Seitenleiste: der Kopf des Chat-Blocks heisst „Chat“ statt „Kanäle“ (Karim 27.10.2026: „Kanäle und DN\n\t//    zusammenlegen. In sowas wie Chat“). Nur hier, der Chat selbst sagt weiter „Kanäle“; deshalb nicht unter\n\t//    „Texte anpassen“. Reihenfolge und Zwischenzeile „DN“ im Feld `scss`. Erst per CSS versucht, der Kopf war dann\n\t//    bei Karim leer; Text ist eindeutig.\n\tfunction chat_kopf() {\n\t\tvar t = document.querySelector('.sidebar-section[data-section-name=\"chat-channels\"] .sidebar-section-header-text');\n\t\tif (t && t.textContent.trim() !== \"Chat\") {\n\t\t\tt.textContent = \"Chat\";\n\t\t}\n\t}\n\n\t// Beim Groessenwechsel erst messen, wenn er vorbei ist (Drehen, Aufklappen, Fenster ziehen); mitten darin stimmen\n\t// die Breiten nicht, und das Menue blieb in der Probe danach versteckt (27.10.2026).\n\tvar gewartet = null;\n\twindow.addEventListener(\"resize\", function () {\n\t\tclearTimeout(gewartet);\n\t\tgewartet = setTimeout(function () {\n\t\t\tblog_menue();\n\t\t\tburger_zeile();\n\t\t}, 150);\n\t});\n\n\tbereit(function () {\n\t\tvar geplant = false;\n\t\tdm_schalter();\n\t\tlogo_und_msa();\n\t\tmsa_zahl();\n\t\tblog_menue();\n\t\tchat_kopf();\n\t\tburger_zeile();\n\t\tnew MutationObserver(function () {\n\t\t\tif (geplant) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgeplant = true;\n\t\t\t// ⚠️ Zeitgeber, kein `requestAnimationFrame`: der ruht in einem Tab im\n\t\t\t//    Hintergrund, und ein so geoeffnetes Forum stand ohne den Link da\n\t\t\t//    (gemessen 25.10.2026 in einer verdeckten Browseransicht).\n\t\t\tsetTimeout(function () {\n\t\t\t\tgeplant = false;\n\t\t\t\tdm_schalter();\n\t\t\t\tlogo_und_msa();\n\t\t\t\tmsa_zahl();\n\t\tmsa_zahl();\n\t\t\t\tblog_menue();\n\t\t\t\tchat_kopf();\n\t\t\t\tburger_zeile();\n\t\t\t}, 50);\n\t\t}).observe(document.body, { childList: true, subtree: true });\n\t});\n})();\n"],"mappings":"AACA,CAAC,YAAY;EACZ,YAAY;;EAEZ,IAAIA,MAAM,GAAG,kBAAkB;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAIC,OAAO,GAAG,CACb,qBAAqB,EACrB,oCAAoC;EACpC;EACA;EACA,yCAAyC;EACzC;EACA,uCAAuC;EACvC;EACA,kCAAkC,EAClC,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,CACvB,CAACC,IAAI,CAAC,GAAG,CAAC;;EAEX;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACC,IAAIC,cAAc,GAAG,KAAK;EAE1B,SAASC,QAAQA,CAAA,EAAG;IACnB,OAAOC,QAAQ,CAACC,IAAI,IAAID,QAAQ,CAACC,IAAI,CAACC,SAAS,CAACC,QAAQ,CAAC,YAAY,CAAC;EACvE;;EAEA;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACC,SAASC,MAAMA,CAACC,EAAE,EAAE;IACnB,IAAIL,QAAQ,CAACC,IAAI,EAAE;MAClBI,EAAE,CAAC,CAAC;MACJ;IACD;IACAL,QAAQ,CAACM,gBAAgB,CAAC,kBAAkB,EAAED,EAAE,EAAE;MAAEE,IAAI,EAAE;IAAK,CAAC,CAAC;EAClE;;EAEA;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACC,SAASC,cAAcA,CAACH,EAAE,EAAE;IAC3B,IAAII,GAAG,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,KAAK;IAE5B,CAAC,SAASC,KAAKA,CAAA,EAAG;MACjB,IAAIb,QAAQ,CAAC,CAAC,EAAE;QACfM,EAAE,CAAC,CAAC;QACJ;MACD;MACA,IAAI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","ignoreList":[]}