/* ============================================================
 * Pagetal CMS – Page-Builder: Baustein-Optik
 * ------------------------------------------------------------
 * Diese Datei enthält AUSSCHLIESSLICH:
 *   1) die tatsächliche, auch auf der veröffentlichten Website
 *      sichtbare Optik der Page-Builder-Bausteine (.pb-container
 *      und deren Modifikator-Klassen) – wird daher im <head> der
 *      öffentlichen Website UND innerhalb der Shadow-DOM-Leinwand
 *      im Builder geladen (siehe partials/kopf.php bzw.
 *      admin/page-builder.php);
 *   2) die rein editor-eigenen Zustände, die visuell direkt an
 *      einen Baustein gebunden sind (Auswahl-Rahmen, Drop-Zonen,
 *      Einfüge-Indikator, Leer-Hinweis, Floating-Toolbar) – deren
 *      Klassen werden ausschliesslich von assets/js/page-builder.js
 *      innerhalb der Leinwand gesetzt und kommen daher auf der
 *      öffentlichen, vom Server gerenderten Seite nie vor.
 *
 * Reine Admin-Chrome (3-Spalten-Layout, Bibliothek, Inspektor,
 * Topbar) steht bewusst NICHT hier, sondern in page-builder.css –
 * jene Datei wird nur im Backend geladen, nie auf der Leinwand
 * selbst oder der öffentlichen Website.
 *
 * Farben/Masse kommen konsequent aus den Theme-Variablen von
 * frontend.css (--gruen, --navy, --weiss, --hellgrau-1 usw.), nie
 * aus fixen Hex-Werten – so folgen die Bausteine automatisch den
 * unter "Design" gewählten Einstellungen.
 * ============================================================ */

/* ---------- Baustein: Container ---------- */
/* padding:0 hier bewusst EXPLIZIT nötig (nicht nur "0 als Ausgangswert"):
   frontend.css definiert eine generische Basis-Regel "section{padding:90px 0;}"
   für die eigenen, semantischen Layout-Sections der Website (z.B. Hero).
   Der Container-Baustein rendert selbst ebenfalls als <section> (siehe
   pagetal_pb_container_rendern()) und würde diese fremde Regel sonst
   erben. Bis v1.12.2 überschrieb die (höher-spezifische) Abstand-Preset-
   Klasse ".pb-abstand-*{padding:...}" diese Regel implizit mit; seit
   v1.13.0 sitzt das Innenabstand-Padding bewusst auf der inneren
   ".container"-Dropzone statt auf diesem äusseren Element (siehe
   "Zwei-Ebenen-Prinzip" in pagetal_pb_container_rendern()) - ohne dieses
   explizite Override würde die generische section-Regel deshalb
   unbeabsichtigt wieder durchschlagen und JEDEN Container (nicht nur
   migrierte) mit einem ungewollten zusätzlichen 90px-Innenabstand oben/
   unten versehen. Bei der Wegwerf-Klon-Verifikation von v1.13.0 genau so
   gefunden (Höhe des äusseren Blocks war 180px zu gross) und hier behoben. */
/* Ab v1.19.99 (echtes "Fixed", siehe ausführlicher Docblock bei
   pagetal_pb_container_parallax_ebene_css() in includes/page-builder.php):
   JEDER Container bekommt zusätzlich (siehe "view-timeline-*" unten) eine
   eigene, nach seiner Sichtbarkeit im Scroll-Fenster benannte
   "Scroll-Driven-Animation"-Zeitachse ("view-timeline"). Bewusst
   UNCONDITIONAL/immer vorhanden (wie die Wrapper-Ebenen weiter unten) -
   eine ungenutzte Zeitachse kostet nichts, macht aber den Umschalt-Effekt
   "Fixed" ein-/ausschalten in der Live-Vorschau wieder rein über
   generiertes CSS möglich, ohne Leinwand-Neurendering. "--pb-fenster" als
   Name wird bewusst auf JEDEM Container identisch vergeben - das ist KEIN
   Konflikt, da ein Nachfahre (die Bildebene weiter unten) bei
   "animation-timeline:--pb-fenster" automatisch den NÄCHSTGELEGENEN
   Vorfahren mit diesem Namen verwendet (exakt wie bei CSS-Zählern/scope-
   bewussten Variablen) - jeder Container bekommt dadurch garantiert seine
   EIGENE Zeitachse, auch wenn mehrere Container mit "Fixed" auf derselben
   Seite vorkommen (per Playwright-Test verifiziert). */
.pb-container{position:relative;padding:0;view-timeline-name:--pb-fenster;view-timeline-axis:block;}

/* Ab v1.19.99: die eigentliche Gegenbewegung für "Fixed" (siehe Docblock
   bei pagetal_pb_container_parallax_ebene_css()) - läuft über die obige
   "--pb-fenster"-Zeitachse komplett im Browser/auf der Grafikkarte, ohne
   jedes Zutun von JavaScript. "--pb-fixiert-margin" liefert
   assets/js/hintergrund-parallax.js einmalig beim Laden sowie bei
   "resize" (siehe dortiger Docblock) - ohne JavaScript (oder ohne
   Browser-Unterstützung von "animation-timeline") bleibt die Variable
   undefiniert, der "calc()"-Fallback "0px" sorgt dann für ein ruhiges,
   unbewegtes Bild statt eines Fehlers. */
@keyframes pb-fixiert-gegenbewegung{
  from{transform:translateY(calc(-1 * var(--pb-fixiert-margin,0px)));}
  to{transform:translateY(var(--pb-fixiert-margin,0px));}
}

/* Video-Hintergrund (Tab "Stil" -> Hintergrund -> Video, ab v1.13.0):
   absolut positioniert HINTER dem Inhalt (z-index:-1), .pb-container hat
   bereits position:relative als Bezugsrahmen. Nur eingefügt, wenn
   tatsächlich ein Video-Hintergrund konfiguriert ist (siehe
   pagetal_pb_container_rendern()). */
.pb-container-hintergrund-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-1;pointer-events:none;}

/* Parallax-Wrapper-Ebenen ("hg"/"ue", ab v1.19.94, siehe Docblock bei
   pagetal_pb_container_parallax_ebene_aktiv() in includes/page-builder.php):
   bewusst IMMER gerendert (siehe pagetal_pb_container_parallax_ebene_html()),
   auch ohne aktiven Effekt - ohne zugewiesenes CSS (siehe
   pagetal_pb_container_parallax_ebene_css()) bleibt ein Fenster dann ein
   leeres 0×0-Element ohne jede Auswirkung.
   Bugfix v1.19.95 (Stephans Bug-Report: schwebender Ziehen-Griff im Editor
   verschwand bei "Anhang: Fixed"): "overflow:hidden" sass bis v1.19.94 auf
   dem GANZEN Container (".pb-container") und schnitt damit auch dessen
   schwebende Floating-Toolbar ab (".pb-floating-toolbar", "top:-38px" -
   ragt bewusst über den Container hinaus, siehe weiter unten). Jetzt trägt
   NUR noch dieses Fenster "overflow:hidden" - exakt auf die Containergrösse
   begrenzt (position:absolute;inset:0), die eigentliche, überdimensionierte
   Bildebene (.pb-container-parallax-ebene) liegt als dessen Kind darin.
   z-index kommt bewusst von HIER (nicht mehr aus generiertem Block-CSS):
   "hg" wie der bisherige Video-Hintergrund hinter allem, "ue" knapp
   darüber, aber weiterhin unter dem eigentlichen Inhalt. */
.pb-container-parallax-fenster{position:absolute;inset:0;overflow:hidden;pointer-events:none;}
.pb-container-parallax-fenster[data-pb-parallax-fenster="hg"]{z-index:-1;}
.pb-container-parallax-fenster[data-pb-parallax-fenster="ue"]{z-index:0;}

/* Container-weiter Link (Tab "Erweitert" -> "Link", ab v1.19.58, Stephans
   Wunsch: "sobald ein link eingetragen [...] wirkt dieser link auf den
   ganzen container"): ein unsichtbares <a> deckt bei gesetztem Link die
   GESAMTE Containerfläche ab (siehe pagetal_pb_container_rendern()/
   pbBausteinHtml() für das Markup). "pointer-events:none" ist hier bewusst
   der SICHERE STANDARDWERT, der überall gilt - sowohl im Editor als auch
   (ohne die gezielte Aktivierung unten) auf der öffentlichen Seite: der
   Editor-Leinwand-Canvas braucht weiterhin uneingeschränkten Klickzugriff
   auf JEDEN verschachtelten Baustein (Textbearbeitung, Ziehen-Greifer,
   Symbolleiste einzelner Kind-Bausteine) - ein durchgehend anklickbares
   Overlay würde genau das verhindern. NUR pagetal_pb_container_block_css()
   (PHP, ausschliesslich die öffentliche Seite) schaltet "pointer-events"
   für einen KONKRETEN, tatsächlich verlinkten Container gezielt per
   [data-pb-block-id]-Selektor (höhere Spezifität) wieder auf "auto" - der
   JS-Zwilling pbContainerBlockCssBauen() (Editor-Live-Vorschau) tut das
   BEWUSST NICHT (einzige, bewusste Ausnahme von der sonst überall
   geltenden 1:1-PHP/JS-Zwillingsregel dieses Projekts, siehe ausführliche
   Begründung dort sowie in PROJEKT-STATUS.md v1.19.58). Zum Bearbeiten
   verschachtelter Bausteine INNERHALB eines verlinkten Containers dient im
   Editor weiterhin die Struktur-Baum-Seitenleiste.
   "z-index:-1" (NICHT positiv!) ist entscheidend für die Klick-
   Weiterleitungstechnik in pagetal_pb_container_block_css(): ein
   ECHTER, per pointer-events wieder aktivierter Link/Button INNERHALB des
   Containers muss im normalen Zeichen-Fluss oberhalb des Overlays liegen
   (Malreihenfolge), damit ein Klick auf IHN gewinnt statt auf das
   Overlay dahinter - mit einem positiven Z-Index läge das Overlay
   fälschlich ÜBER jedem normalen Inhalt (auch über echten Links), da
   positioniertes CSS mit z-index:0/positiv laut Zeichen-Reihenfolge immer
   NACH normalem, nicht positioniertem Fluss-Inhalt gezeichnet wird - beim
   ersten Test dieser Technik per Playwright genau so nachgewiesen (ein
   eigener Link im Container wurde faelschlich vom Overlay "verdeckt")
   und dadurch vor der Auslieferung korrigiert. Mit "z-index:-1" zeichnet
   der Browser das Overlay VOR (=unter) jedem normalen Fluss-Inhalt -
   Text/Bilder OHNE eigenen Link "fallen" dadurch zum Overlay durch
   (siehe pointer-events:none in pagetal_pb_container_block_css()), ein
   ECHTER Link bleibt aber klickbar, weil er im normalen Fluss über dem
   Overlay liegt. ".pb-container" trägt bereits position:relative als
   Bezugsrahmen (analog ".pb-container-hintergrund-video" oben, das aus
   demselben Grund ebenfalls z-index:-1 nutzt) - zusätzlich erzwingt
   pagetal_pb_container_block_css() für einen tatsächlich verlinkten
   Container "isolation:isolate" auf dem Container selbst, damit dieses
   negative Z-Index NICHT versehentlich hinter vorangehende Geschwister-
   Bausteine auf derselben Seite "durchrutscht" (eigener, lokal
   abgeschotteter Stapelkontext NUR für diesen einen Container). */
.pb-container-link-overlay{position:absolute;inset:0;z-index:-1;display:block;pointer-events:none;}

/* Baustein "Meldung" (ab v1.19.65) - der optionale Baustein-weite Link
   (Tab "Inhalt" -> "Link-URL") nutzt dieselbe "z-index:-1 + inset:0"-
   Overlay-Technik wie ".pb-container-link-overlay" oben (siehe dort für
   die volle Begründung). "isolation:isolate" erzwingt
   pagetal_pb_meldung_block_css() zusätzlich NUR für einen tatsächlich
   verlinkten Meldung-Baustein direkt auf [data-pb-block-id="..."]. */
.pb-meldung-link-overlay{position:absolute;inset:0;z-index:-1;display:block;pointer-events:none;}

/* Hintergrundfarbe/-verlauf/-bild, Rand, Box-Schatten, Effekte, Abstand
   und Z-Index sind ab v1.13.0 KEINE festen CSS-Klassen mehr (frei
   wählbare Werte statt fixer Presets) – sie werden als generiertes,
   block-spezifisches CSS über [data-pb-block-id="..."] ausgeliefert
   (siehe pagetal_pb_container_block_css() in includes/page-builder.php
   und pbBausteinCssBauen() in assets/js/page-builder.js). Die Klassen
   ".pb-spalten-N"/".pb-zeilen-M" bleiben trotzdem bestehen, weil die
   Spaltenzahl unmittelbar mit der Drag&Drop-Erkennung verzahnt ist
   (siehe pbEinfuegeIndexBestimmen() in page-builder.js, liest die Zahl
   per Regex aus dem Klassennamen) – ihr HIER definiertes CSS
   (display:grid/grid-template-*) ist seit v1.14.0 allerdings reine
   Rückfalloption: das tatsächlich wirksame CSS (inkl. Umbruchverhalten,
   siehe Begründung dort) setzt IMMER das generierte, block-spezifische
   CSS mit höherer Selektor-Spezifität. ".pb-zeilen-M" wirkt sich seit
   v1.14.0 gar nicht mehr aus (Raster läuft jetzt über Flexbox, das keine
   feste Zeilenzahl kennt) – bewusst nicht entfernt, da die Klasse selbst
   harmlos ist und an anderer Stelle (falls je wieder gebraucht) sonst
   neu erfunden werden müsste. */
.pb-spalten-1{display:grid;grid-template-columns:1fr;}
.pb-spalten-2{display:grid;grid-template-columns:repeat(2,1fr);}
.pb-spalten-3{display:grid;grid-template-columns:repeat(3,1fr);}
.pb-spalten-4{display:grid;grid-template-columns:repeat(4,1fr);}
.pb-spalten-5{display:grid;grid-template-columns:repeat(5,1fr);}
.pb-spalten-6{display:grid;grid-template-columns:repeat(6,1fr);}
.pb-spalten-7{display:grid;grid-template-columns:repeat(7,1fr);}
.pb-spalten-8{display:grid;grid-template-columns:repeat(8,1fr);}
.pb-spalten-9{display:grid;grid-template-columns:repeat(9,1fr);}
.pb-spalten-10{display:grid;grid-template-columns:repeat(10,1fr);}
.pb-spalten-11{display:grid;grid-template-columns:repeat(11,1fr);}
.pb-spalten-12{display:grid;grid-template-columns:repeat(12,1fr);}
.pb-zeilen-1{grid-template-rows:1fr;}
.pb-zeilen-2{grid-template-rows:repeat(2,1fr);}
.pb-zeilen-3{grid-template-rows:repeat(3,1fr);}
.pb-zeilen-4{grid-template-rows:repeat(4,1fr);}
.pb-zeilen-5{grid-template-rows:repeat(5,1fr);}
.pb-zeilen-6{grid-template-rows:repeat(6,1fr);}
.pb-zeilen-7{grid-template-rows:repeat(7,1fr);}
.pb-zeilen-8{grid-template-rows:repeat(8,1fr);}
.pb-zeilen-9{grid-template-rows:repeat(9,1fr);}
.pb-zeilen-10{grid-template-rows:repeat(10,1fr);}
.pb-zeilen-11{grid-template-rows:repeat(11,1fr);}
.pb-zeilen-12{grid-template-rows:repeat(12,1fr);}
/* Bugfix v1.14.0: einen festen @media-Kollaps der Spalten-Layouts gibt es
   bewusst NICHT mehr (weder hier noch in includes/design.php,
   pagetal_design_responsive_css()) – Raster (Grid)-Container laufen seit
   v1.14.0 über Flexbox (flex-wrap) und brechen dadurch stufenlos an der
   tatsächlich verfügbaren Breite um, statt stur bei zwei festen
   Breakpoints einzuspaltig zu stapeln (Bug-Report Stephan). Siehe
   pagetal_pb_container_block_css()/pbContainerBlockCssBauen(). */

/* Inhaltsbreite "Volle Breite" (Tab "Design", ab v1.13.0): der
   breitenbegrenzte .container-Innenbereich (frontend.css) verliert seine
   max-width, behält aber seinen horizontalen Innenabstand
   (--container-innenabstand) als Gutter. */
.pb-container-voll > .container{max-width:none;}

/* Bugfix v1.13.2: Kind-Bausteine INNERHALB eines Containers dürfen kein
   eigenes vertikales Margin mehr mitbringen - sonst bleibt trotz
   "Lücke (Gap)" = 0px (oder global auf 0px gestellt) sichtbarer Abstand
   übrig, weil z.B. .pb-ueberschrift/.pb-texteditor (siehe weiter unten)
   ein festes margin-bottom:20px für die Verwendung AUSSERHALB von
   Containern (direkt auf der Seiten-Wurzel, wo es KEINE Gap-Einstellung
   gibt und dieses Margin die einzige Abstandsquelle zwischen Bausteinen
   ist) tragen. Innerhalb eines Containers soll ausschliesslich "Lücke"
   (column-gap/row-gap, siehe pagetal_pb_container_block_css()) über den
   Abstand zwischen Geschwister-Bausteinen entscheiden - deshalb hier
   gezielt auf 0 zurückgesetzt. Bewusst nur für ".container" MIT
   "data-pb-dropzone" (echte Container-Dropzone, sowohl im Editor als
   auch auf der öffentlichen Seite) - die Seiten-Wurzel trägt im Editor
   zwar ebenfalls "data-pb-dropzone", aber NICHT die Klasse "container"
   (siehe #pb-wurzel-container/.pb-seiteninhalt-innen in
   assets/js/page-builder.js) und bleibt von dieser Regel unberührt.

   WICHTIG: ":not(.pb-container)" schliesst verschachtelte Container
   (Container-in-Container) bewusst aus. Ohne diesen Ausschluss würde
   diese Regel (Spezifität: Klasse + Attribut = höher als die einzelne
   Attribut-Selektor-Regel "[data-pb-block-id=X]{margin:...}", über die
   der eigene Aussenabstand eines Containers gesetzt wird, siehe
   pagetal_pb_container_block_css()) den vom Nutzer explizit gesetzten
   Aussenabstand eines verschachtelten Containers unbeabsichtigt
   überschreiben, sobald dieser innerhalb eines anderen Containers liegt. */
.container[data-pb-dropzone] > *:not(.pb-container){margin-top:0;margin-bottom:0;}

/* ---------- Baustein: Überschrift ---------- */
/* Bugfix v1.13.3: "padding:4px 2px" stand hier unbegründet und
   undokumentiert seit dem allerersten Commit (v1.9.0-Basis) – keine
   andere Stelle in CSS/JS setzt das funktional voraus (Auswahl-/
   Container-Rahmen im Editor nutzen bewusst "outline" mit negativem
   "outline-offset" statt Padding, siehe .pb-auswahl/.pb-container-rahmen
   weiter unten – genau damit kein zusätzlicher Platz im Boxmodell nötig
   ist). Es widersprach ausserdem dem mit v1.13.2 etablierten Prinzip
   "Null ist null": selbst bei Lücke=0 UND Aussenabstand=0 blieb über
   dieses Padding ein sichtbarer Rest-Abstand (4px oben/unten, 2px
   links/rechts) bestehen. Auf Wunsch von Stephan entfernt – Abstand
   zwischen Bausteinen wird jetzt AUSSCHLIESSLICH über Lücke (Gap)
   und/oder Innen-/Aussenabstand gesteuert, wie vorgesehen. */
.pb-ueberschrift{position:relative;margin:0 0 20px;padding:0;}

/* ---------- Baustein: Texteditor ---------- */
/* Ab v1.19.5 (Stephans Bug-Report Punkt 5): die frühere feste Klasse
   ".pb-texteditor-schmal" (altes Feld "Breite": Normal/Schmal) wurde
   entfernt - durch die neue, für ALLE Bausteine geltende "Erweitert" ->
   "Breite/Höhe"-Funktion ersetzt (siehe pagetal_pb_baustein_groesse_css()
   in includes/page-builder.php). */
.pb-texteditor{position:relative;margin:0 0 20px;padding:0;line-height:1.7;color:var(--grau-text);}
.pb-texteditor p{margin:0 0 16px;}
.pb-texteditor p:last-child{margin-bottom:0;}
.pb-texteditor ul,.pb-texteditor ol{margin:0 0 16px 22px;}
.pb-texteditor ul{list-style:disc;}
.pb-texteditor ol{list-style:decimal;}
.pb-texteditor li{margin-bottom:6px;}
/* Ab v1.19.37 (Stephans Bug-Report Punkt 2 UND Punkt 3 - derselbe
   Grund-Ursache, siehe Docblock bei ".pb-navigationsmenue-links a" weiter
   unten): das feste "color:var(--gruen)" wurde ENTFERNT. Stephan
   verlangt für das neue Link-Icon ausdrücklich "die farbgestaltung ist
   so wie in den einstellungen definierten linkfarbe für normal und
   hover" - das setzt voraus, dass der Link-TEXT selbst bereits dieser
   Einstellung folgt. Vorher tat er das nicht: die Klassen-selektierte
   Regel hier hatte dieselbe/höhere CSS-Spezifität wie die globale
   Typografie-Regel ("a{color:...}"/"a:hover{color:...}", siehe
   pagetal_design_typografie_css() in includes/design.php) und
   überschrieb dadurch die unter "Design -> Typografie je Element ->
   Link" konfigurierte Farbe dauerhaft - ganz besonders beim Hover, wo
   beide Regeln exakt dieselbe Spezifität hatten und daher rein von der
   Lade-Reihenfolge abhing, welche gewinnt (faktisch nie zuverlässig die
   konfigurierte Hover-Farbe). "text-decoration:underline" bleibt
   bestehen, das ist reine Texteditor-Optik, keine Farbe. */
.pb-texteditor a{text-decoration:underline;}
/* Ab v1.19.37 (Stephans Bug-Report Punkt 2: "wenn in texteditor ein teil
   markiert wird und ein link hinzugefügt wird soll ein icon nach dem
   text erscheinen (dynamisch), das icon hat die genau gleiche grösse
   des textes... farbgestaltung ist so wie in den einstellungen
   definierten linkfarbe für normal und hover"): dynamisches Icon nach
   JEDEM Link im Texteditor, rein per CSS (keine JS-Inhalts-Manipulation
   nötig) - so bleibt der gespeicherte HTML-Inhalt selbst unverändert
   und das Icon passt sich automatisch an, sobald sich Text/Link-Grösse
   oder -Farbe ändert. Technik: "mask-image" mit einer eingebetteten
   SVG-Daten-URI (wiederverwendetes 'extern'-Icon, siehe
   includes/icons.php) plus "background-color:currentColor" - dadurch
   übernimmt das Icon IMMER automatisch exakt dieselbe Farbe wie der
   umgebende Link-Text, inklusive Hover (da ":hover" bereits die Farbe
   des <a> selbst ändert und "currentColor" das live mitverfolgt - keine
   eigene ":hover"-Regel fürs Icon nötig). Grösse in "em" gesetzt, damit
   das Icon IMMER exakt der aktuellen Schriftgrösse des Textes entspricht
   (auch bei Ebene wie H2 usw.). Kleiner Abstand links UND rechts
   (margin), damit es sich harmonisch in den Textfluss einfügt, statt zu
   kleben. Das eingebettete SVG selbst nutzt bewusst einen deckenden
   WEISSEN Strich (nicht "currentColor", Daten-URIs können keine
   CSS-Variablen auflösen) - sowohl helligkeits- als auch alphabasierte
   Masken-Implementierungen der Browser stellen Weiss auf transparentem
   Grund dadurch zuverlässig als "sichtbar" dar. */
.pb-texteditor a::after{
  content:'';
  display:inline-block;
  width:1em;
  height:1em;
  margin:0 .15em 0 .25em;
  vertical-align:-.15em;
  background-color:currentColor;
  -webkit-mask-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiPjwvcGF0aD48cG9seWxpbmUgcG9pbnRzPSIxNSAzIDIxIDMgMjEgOSI+PC9wb2x5bGluZT48bGluZSB4MT0iMTAiIHkxPSIxNCIgeDI9IjIxIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPg==");
  mask-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiPjwvcGF0aD48cG9seWxpbmUgcG9pbnRzPSIxNSAzIDIxIDMgMjEgOSI+PC9wb2x5bGluZT48bGluZSB4MT0iMTAiIHkxPSIxNCIgeDI9IjIxIiB5Mj0iMyI+PC9saW5lPjwvc3ZnPg==");
  -webkit-mask-size:contain;
  mask-size:contain;
  -webkit-mask-repeat:no-repeat;
  mask-repeat:no-repeat;
  -webkit-mask-position:center;
  mask-position:center;
}
/* Ab v1.17.52 (Stephans Wunsch: "Basis-Upgrade" analog WordPress) -
   h2/h3/h4 erben Schriftschnitt/-farbe bereits von der globalen Regel
   "h1,h2,h3,h4{font-weight:700;line-height:1.2;color:var(--navy);}"
   (assets/css/frontend.css) - hier nur die im Texteditor-Kontext
   sinnvolle Grössen-Abstufung/den Abstand ergänzt, siehe
   pagetal_pb_html_bereinigen() für die zugehörige Server-Whitelist.
   Ab v1.19.37 (Stephans Bug-Report Punkt 2/3): die früheren festen
   "font-size"-Werte je Überschrift-Ebene wurden ENTFERNT - sie
   überschrieben (höhere CSS-Spezifität durch die Klasse ".pb-texteditor")
   IMMER die unter "Design -> Typografie je Element" konfigurierte
   Schriftgrösse, unabhängig davon, was dort eingestellt war. Nur der
   Zeilenabstand (margin) bleibt hier bestehen, die Schriftgrösse kommt
   jetzt ausschliesslich aus der globalen Typografie. Ausserdem neu:
   h1/h5/h6-Regeln, da der Texteditor-Werkzeugkasten (siehe
   pbInhaltTabRendern() in assets/js/page-builder.js) ab sofort auch
   diese Formate anbietet, nicht mehr nur h2-h4. */
.pb-texteditor h1{margin:0 0 20px;}
.pb-texteditor h2{margin:0 0 16px;}
.pb-texteditor h3{margin:0 0 14px;}
.pb-texteditor h4{margin:0 0 12px;}
.pb-texteditor h5{margin:0 0 10px;}
.pb-texteditor h6{margin:0 0 8px;}
.pb-texteditor h1:last-child,.pb-texteditor h2:last-child,.pb-texteditor h3:last-child,.pb-texteditor h4:last-child,.pb-texteditor h5:last-child,.pb-texteditor h6:last-child{margin-bottom:0;}
.pb-texteditor blockquote{margin:0 0 16px;padding:4px 0 4px 18px;border-left:3px solid var(--gruen);font-style:italic;color:var(--navy);}
.pb-texteditor blockquote:last-child{margin-bottom:0;}
.pb-texteditor blockquote p{margin:0 0 8px;}
.pb-texteditor blockquote p:last-child{margin-bottom:0;}
.pb-texteditor hr{margin:24px 0;border:none;border-top:1px solid var(--hellgrau-2);}
.pb-texteditor s,.pb-texteditor strike{text-decoration:line-through;}

/* ---------- Baustein: Sammlungstypen-Feld (Platzhalter im Editor) ---------- */
/* Ab v1.17.35 (Stephans Bug-Report: "kann nicht per Drag and Drop
   verschoben werden... wird im Container noch freiliegend"): dieser
   Platzhalter (siehe pbBlockHtml() in assets/js/page-builder.js) bekam
   im Gegensatz zu .pb-ueberschrift/.pb-texteditor nie ein eigenes
   "position:relative" - sein ".pb-floating-toolbar" (mit dem Ziehen-
   Greifer, siehe dort, "position:absolute;top:-38px") positionierte sich
   dadurch relativ zum nächsten POSITIONIERTEN VORFAHREN (z.B. der
   Leinwand-Wurzel) statt relativ zum Platzhalter selbst - der Greifer
   landete dadurch weit entfernt von seinem eigentlichen Baustein, wo er
   praktisch nicht mehr treffbar war (Ziehen im Struktur-Baum war davon
   nicht betroffen, der nutzt einen eigenen, unabhängigen Mechanismus).
   margin-bottom analog .pb-ueberschrift/.pb-texteditor (Basis-Abstand
   nach unten, kann durch die neue Archiv-Einstellung "Abstand zwischen
   den Widgets" überschrieben werden, siehe includes/page-builder.php). */
.pb-sammlungstypen-feld-platzhalter{position:relative;margin:0 0 20px;}

/* ---------- Baustein: Seitentitel/Breadcrumb (Drag&Drop im Editor) ---------- */
/* Ab v1.17.54 (Stephans Bug-Report: "kann die Bausteine Seitentitel und
   Breadcrumb nicht per Drag & Drop im Pagebuilder verschieben") - exakt
   derselbe, bereits einmal behobene Fehlertyp wie beim Sammlungstypen-Feld
   weiter oben (siehe dortiger Kommentar, v1.17.35): ".pb-hero-titel-bereich"/
   ".pb-hero-permalink-bereich" (siehe pbBlockHtml() in page-builder.js
   sowie pagetal_pb_seitentitel_rendern()/pagetal_pb_breadcrumb_rendern() in
   includes/page-builder.php) bekamen nie ein eigenes "position:relative" -
   ihr im Editor eingefügter ".pb-floating-toolbar" (mit dem Ziehen-Greifer,
   "position:absolute;top:-38px") positionierte sich dadurch relativ zum
   nächsten POSITIONIERTEN VORFAHREN (z.B. der Leinwand-Wurzel) statt
   relativ zum jeweiligen Baustein selbst - der Greifer landete dadurch weit
   entfernt von seinem eigentlichen Baustein, wo er praktisch nicht mehr
   treffbar war. Beide Klassen werden zwar auch auf der ÖFFENTLICHEN Seite
   gerendert, dort erzeugt der Server aber nie ein ".pb-floating-toolbar"-
   Element darunter (das kommt ausschliesslich aus der Editor-Logik oben) -
   "position:relative" allein hat für sich genommen keinerlei sichtbaren
   Effekt auf normale Blockelemente wie hier (h1/p.breadcrumb im normalen
   Textfluss, keine absolut positionierten Kind-Elemente im echten Rendering)
   und verändert daher auf der Live-Seite nichts. */
.pb-hero-titel-bereich,.pb-hero-permalink-bereich{position:relative;}
/* Ab v1.17.57 KORRIGIERT (Stephans Bug-Report: "hier gibt es einen abstand
   zwischen den widgets [im Pagebuilder]. wenn ich im frontend bin ist
   dieser abstand nicht [...] wir müssen dies im pagebuilder so anzeigen,
   wie es im frontend angezeigt wird, sonst ist es irreführend"): die in
   v1.17.54 hier ergänzte Regel "margin-bottom:20px" (nur innerhalb von
   "#pb-wurzel", siehe Kommentar-Historie unten) war zwar technisch
   editor-only und veränderte nie die Live-Seite - sie erzeugte aber genau
   den von Stephan zu Recht bemängelten optischen Widerspruch: einen
   sichtbaren Abstand im Pagebuilder zwischen zwei direkt aufeinander
   folgenden Seitentitel-/Breadcrumb-Bausteinen, den es auf der echten
   Seite gar nicht gibt - der Editor sollte aber WYSIWYG sein. Erneute
   Untersuchung per Playwright ergab: das ursprüngliche Problem (Griff des
   ZWEITEN Bausteins landet in der Fläche des davorstehenden ERSTEN,
   elementFromPoint trifft den falschen Baustein statt des Griffs) trat
   beim erneuten, sauberen Test mit Standard-Werten (kein manuell
   gesetzter Z-Index) GAR NICHT mehr auf - "position:relative" allein
   reicht hier tatsächlich aus, weil das DOM des zweiten (späteren)
   Bausteins in der Stapelreihenfolge automatisch über dem ersten liegt.
   Der ursprüngliche Fehlschlag beim allerersten Test dieses Bugs entpuppte
   sich als Test-Artefakt: die dabei verwendete Testseite hatte durch
   FRÜHERE, unabhängige Tests des "Erweitert"-Tab-Felds "Z-Index" bereits
   einen von 0 abweichenden Wert auf dem ERSTEN Baustein stehen (z.B. "9"),
   wodurch dieser bewusst höher gestapelt wurde als der zweite, ausgewählte
   Baustein - mit Z-Index 0 auf beiden Seiten (Normalfall bei praktisch
   jeder echten Seite) ist das kein Problem. Damit ein Nutzer, der einem
   VORDEREN Hero-Baustein bewusst einen hohen "Erweitert"-Z-Index vergibt,
   trotzdem nicht denselben Effekt erneut erleben kann, bekommt der gerade
   AUSGEWÄHLTE Baustein (Klasse ".pb-auswahl", wird ohnehin schon für den
   gestrichelten Auswahlrahmen genutzt, siehe weiter unten) hier zusätzlich
   einen sehr hohen Z-Index - wieder bewusst NUR innerhalb von "#pb-wurzel"
   (siehe Erklärung oben, existiert nie auf der öffentlichen Seite) - damit
   sein Griff in JEDEM Fall über allen Nachbar-Bausteinen liegt, unabhängig
   von deren eigenem Z-Index. Die alte "margin-bottom"-Regel entfällt
   ersatzlos, der Pagebuilder zeigt Seitentitel/Breadcrumb jetzt exakt so
   an wie das veröffentlichte Frontend. */
#pb-wurzel .pb-hero-titel-bereich.pb-auswahl,#pb-wurzel .pb-hero-permalink-bereich.pb-auswahl{z-index:60;}

/* ---------- Baustein: Sammlungstypen-Feld (Ausrichtung im FRONTEND) ---------- */
/* Ab v1.17.35 (Stephans Bug-Report: "die ausrichtung wird im pagebuilder
   angezeigt hat aber im frontend keine wirkung"): Der Editor setzt die
   Ausrichtung als Inline-Style direkt auf den Platzhalter (siehe
   pbBlockHtml() in assets/js/page-builder.js, Baustein
   "sammlungstypen_feld"), aber pagetal_pb_sammlungstypen_feld_rendern()
   (includes/page-builder.php) gibt für die ÖFFENTLICHE Ausgabe stattdessen
   nur die Klasse "pb-sammlungstypen-feld-ausrichtung-{links|zentriert|
   rechts}" aus - für die es hier nie eine passende CSS-Regel gab, weshalb
   die Einstellung im Frontend wirkungslos blieb. Diese drei Regeln
   schliessen genau diese Lücke, ohne am bestehenden Editor-Verhalten
   irgendetwas zu ändern. */
.pb-sammlungstypen-feld-ausrichtung-links{text-align:left;}
.pb-sammlungstypen-feld-ausrichtung-zentriert{text-align:center;}
.pb-sammlungstypen-feld-ausrichtung-rechts{text-align:right;}

/* ---------- Baustein: Navigationsmenü (ab v1.18.0, Nutzerwunsch Stephan:
   Header-/Footer-Templates - zeigt automatisch dieselbe Hauptnavigation
   wie das bisherige, fest einprogrammierte "nav.primary" (siehe
   partials/kopf.php) an, damit sich ein neu gestalteter Header optisch
   nahtlos einfügt. "justify-content" je Ausrichtung wird dynamisch als
   Block-CSS ergänzt (siehe pagetal_pb_navigationsmenue_block_css()),
   Basis-Optik (Schriftgewicht/-farbe, Abstand zwischen den Punkten,
   Hover-Farbe) bewusst 1:1 von "nav.primary" übernommen (frontend.css)
   - dieselbe Navigation soll in einem eigenen Header-Template optisch
   nicht anders wirken als im bisherigen. ---------- */
/* "position:relative" ab v1.18.0 (Stephans Bug-Report: "navigationswidget
   kann nicht mit drag an drop im pagebuilder verschoben werden") - exakt
   derselbe, bereits zweimal behobene Fehlertyp wie beim Sammlungstypen-
   Feld (v1.17.35) und bei Seitentitel/Breadcrumb (v1.17.54, siehe
   ausführlicher Kommentar dort): ohne eigenes "position:relative"
   positioniert sich der im Editor eingefügte ".pb-floating-toolbar" (mit
   dem Ziehen-Greifer, "position:absolute;top:-38px") relativ zum
   nächsten POSITIONIERTEN VORFAHREN statt relativ zum Baustein selbst -
   der Greifer landet dadurch weit entfernt vom eigentlichen Baustein, wo
   er praktisch nicht mehr treffbar ist. Auf der öffentlichen Seite
   erzeugt der Server nie ein ".pb-floating-toolbar"-Element (kommt
   ausschliesslich aus der Editor-Logik in page-builder.js) - dort hat
   "position:relative" für sich genommen keine sichtbare Auswirkung. */
.pb-navigationsmenue{position:relative;display:flex;align-items:center;flex-wrap:wrap;}
.pb-navigationsmenue-leer{position:relative;font-size:.8rem;color:#9aa3ad;font-style:italic;}

/* Icon-Liste-Widget (ab v1.19.0): Layout/Farben/Typografie/Abstand/
   responsives Text-Ausblenden kommen ausschliesslich über das je Baustein
   generierte CSS (siehe pagetal_pb_icon_liste_block_css() in
   includes/page-builder.php bzw. pbIconListeBlockCssBauen() im Editor) -
   hier nur der Leer-Zustand-Platzhalter (nie auf der veröffentlichten
   Seite sichtbar, siehe pagetal_pb_icon_liste_rendern()), analog
   .pb-navigationsmenue-leer oben. */
.pb-icon-liste-leer{position:relative;font-size:.8rem;color:#9aa3ad;font-style:italic;}
/* Ab v1.19.1 (Stephans Bug-Report: "ich kann das neue Widget nicht per
   Drag and Drop im Pagebuilder bewegen") - exakt derselbe, bereits
   dreimal behobene Fehlertyp wie beim Sammlungstypen-Feld (v1.17.35),
   bei Seitentitel/Breadcrumb (v1.17.54) und beim Navigationsmenü
   (v1.18.0, siehe deren ausführliche Kommentare oben): ".pb-icon-liste"
   (das eigentliche, BEFÜLLTE Element - im Gegensatz zum bereits korrekt
   behandelten Leer-Zustand ".pb-icon-liste-leer" oben) bekam nie ein
   eigenes "position:relative" - sein im Editor eingefügter
   ".pb-floating-toolbar" (mit dem Ziehen-Greifer, "position:absolute;
   top:-38px") positionierte sich dadurch relativ zum nächsten
   POSITIONIERTEN VORFAHREN statt relativ zum Baustein selbst, der
   Greifer landete dadurch weit entfernt von seinem eigentlichen
   Baustein und war praktisch nicht mehr treffbar. Damit dieser
   Fehlertyp nicht ein fünftes Mal auftritt: JEDER neue Page-Builder-
   Baustein MUSS auf seinem äussersten, tatsächlich befüllten
   Wurzelelement "position:relative" tragen (unabhängig davon, ob der
   Leer-Zustand-Platzhalter das schon hat) - siehe Checkliste in
   PROJEKT-STATUS.md. Auf der öffentlichen Seite hat die Regel wie bei
   den anderen drei Bausteinen keine sichtbare Auswirkung (kein
   ".pb-floating-toolbar" ausserhalb des Editors). */
/* Ab v1.19.1 (Stephans Bug-Report: "Automatische Erkennung ... die Icons
   werden immer ohne Text angezeigt, egal wie breit die Anzeige gerade
   ist"): Ursache war NICHT die Erkennungslogik selbst (assets/js/
   icon-liste-mobil.js), sondern eine strukturelle Lücke, die erst bei
   Stephans konkretem Testfall sichtbar wurde - eine Icon-Liste INNERHALB
   einer Topbar-Spalte (".pb-topbar-spalte" ist selbst "display:flex").
   Ohne eigene Flex-Eigenschaft ist ".pb-icon-liste" dort ein ganz
   normaler FLEX-ITEM seines Eltern-Elements - und ein Flex-Item ohne
   "flex-grow" nimmt gemäss CSS-Spezifikation NIE automatisch den
   verfügbaren Platz ein, sondern schrumpft/wächst rein nach seinem
   EIGENEN Inhalt ("shrink-to-fit"). ".clientWidth" der Liste selbst
   entsprach dadurch nie der TATSÄCHLICH verfügbaren Spaltenbreite,
   sondern nur der Breite ihres GERADE gerenderten Inhalts - sobald der
   Text einmal (z.B. durch einen kurzen Layout-Sprung beim ersten
   Messen) ausgeblendet wurde, blieb "clientWidth" fortan auf die
   winzige Icon-only-Breite eingefroren, wodurch die Erkennung sich
   selbst dauerhaft in den "kein Platz"-Zustand einsperrte, unabhängig
   von der tatsächlichen Fensterbreite. Ausserhalb eines Flex-Kontexts
   (z.B. eine Icon-Liste direkt auf der Seiten-Wurzel) trat der Fehler
   NICHT auf: dort ist ".pb-icon-liste" ein normaler Block (kein
   Flex-Item), Block-Elemente füllen ihren Container standardmässig
   ohnehin vollständig aus. "flex:1 1 auto" behebt das strukturell für
   JEDEN Flex-Elternkontext (Topbar-Spalte, Header-Spalte, ein Container
   mit "Kinder nebeneinander"): die Liste nimmt jetzt zuverlässig den
   ihr zugewiesenen Platz ein, wodurch "clientWidth" wieder korrekt die
   tatsächlich verfügbare Breite widerspiegelt - ausserhalb eines
   Flex-Elternkontexts hat die Eigenschaft keinerlei Wirkung (nur
   Flex-ITEMS werten "flex" überhaupt aus), also 0 Verhaltensänderung
   für den bereits funktionierenden Fall. "min-width:0" hebt zusätzlich
   die Flexbox-Standardvorgabe "min-width:auto" auf (die ein Flex-Item
   sonst nie unter seine eigene Inhalts-Mindestbreite schrumpfen lässt) -
   ohne das könnte eine lange, nicht umbrechende Zeile die gesamte
   Spalte/den Header gegen die Absicht dieser Einstellung aufweiten. */
.pb-icon-liste{position:relative;flex:1 1 auto;min-width:0;}

/* Baustein "Soziale Icons" (ab v1.19.43): "position:relative" ist hier
   PFLICHT (siehe ausführliche Begründung + Checkliste direkt oberhalb bei
   ".pb-icon-liste") - der Editor-Floating-Toolbar dieses Bausteins
   positioniert sich sonst relativ zum nächsten positionierten Vorfahren
   statt relativ zum Baustein selbst. Form/Farbe/Grösse/Abstand/Hover
   kommen ausschliesslich über das je Baustein generierte CSS (siehe
   pagetal_pb_soziale_icons_block_css() in includes/page-builder.php bzw.
   pbSozialeIconsBlockCssBauen() im Editor) - hier nur der Leer-Zustand-
   Platzhalter (nie auf der veröffentlichten Seite sichtbar) und dieses
   strukturelle Minimum, analog ".pb-icon-liste" oben. */
.pb-soziale-icons{position:relative;}
.pb-soziale-icons-element{list-style:none;}

/* Ab v1.18.0 ("Vollpaket"-Erweiterung, Stephans Wunsch nach mehr
   Einstellungsmöglichkeiten analog Elementor): die Menüpunkte stecken
   jetzt in einem eigenen Wrapper ".pb-navigationsmenue-links" statt
   direkt im <nav> - macht "gap" (Abstand zwischen den Menüpunkten, siehe
   pagetal_pb_navigationsmenue_block_css()) UND das Ein-/Ausblenden fürs
   Mobil-Menü unabhängig vom Umschalter-Button möglich. "gap:30px" hier
   ist bewusst nur der Fallback-Wert (identisch zum bisherigen, fest
   einprogrammierten Abstand) - jedes tatsächliche Navigationsmenü
   bekommt seinen Abstand über das dynamische Block-CSS gezielt
   überschrieben (siehe dort), reproduziert also 0 Verhaltensänderung für
   bereits bestehende, noch nicht angepasste Navigationsmenüs. */
.pb-navigationsmenue-links{display:flex;align-items:center;flex-wrap:wrap;gap:30px;}
/* Ab v1.19.37 (Stephans Bug-Report Punkt 3): "font-size:.92rem",
   "color:var(--navy)" und die eigene ":hover{color:var(--gruen-dunkel);}"
   wurden ENTFERNT - diese Klassen-selektierte Regel hatte höhere
   CSS-Spezifität als die globale Typografie ("a{...}"/"a:hover{...}",
   siehe pagetal_design_typografie_css() in includes/design.php) und
   überschrieb dadurch IMMER die unter "Design -> Typografie je Element ->
   Link" konfigurierte Grösse/Farbe/Hover-Farbe - selbst dann, wenn dort
   gar keine Hover-Farbe gesetzt war (genau die vom Nutzer gemeldete,
   "nirgends definierte" grüne Hover-Farbe). "font-weight"/
   "text-decoration" bleiben als reine Navigationsmenü-Optik bestehen, die
   nicht Teil der globalen Link-Typografie ist. */
.pb-navigationsmenue-links a{font-weight:600;text-decoration:none;}

/* Ab v1.18.2 (Stephans Wunsch nach Untermenüs im Baustein
   "Navigationsmenü", siehe pagetal_seiten_navigation_baum_laden()/
   pagetal_pb_navigationsmenue_eintrag_html()): ein Menüpunkt MIT
   Unterseiten (".pb-navigationsmenue-hat-kinder") bekommt auf dem
   Desktop ein Dropdown, das bei Hover ODER Tastatur-Fokus
   (":focus-within", z.B. TAB-Taste) erscheint - komplett CSS-only, keine
   zusätzliche Klick-Logik nötig. Verschachtelte Untermenüs (Enkel-Ebene)
   klappen seitlich auf ("left:100%" statt darunter), damit sie sich
   nicht mit dem eigenen Elternmenü überlappen. Die Positionierung selbst
   ist bewusst NICHT über das dynamische Block-CSS konfigurierbar (nur
   der Innenabstand zwischen den Einträgen wird dort an "abstand"
   angeglichen, siehe pagetal_pb_navigationsmenue_block_css()) - Farbe/
   Schrift/Hover-Effekt innerhalb des Dropdowns übernehmen automatisch
   dieselben Design-Einstellungen wie die oberste Ebene, da dieselben
   Selektoren (".pb-navigationsmenue-links > .pb-navigationsmenue-eintrag > a"
   trifft dank CSS-Kaskade NICHT die tiefer verschachtelten Links - siehe
   dazu die eigene, absichtlich weiter gefasste Regel unten) greifen. Im
   gestapelten Mobil-Menü (fest oder automatisch erkannt, siehe dort)
   wird diese freischwebende Positionierung wieder aufgehoben - dort
   klappt das Untermenü stattdessen normal im Textfluss nach unten auf,
   erst nach einem Klick auf den Indikator (Klasse
   ".pb-navigationsmenue-untermenue-offen", siehe
   assets/js/navigationsmenue-mobil.js). */
.pb-navigationsmenue-eintrag{position:relative;}
.pb-navigationsmenue-indikator{display:inline-flex;margin-left:6px;vertical-align:middle;line-height:0;transition:transform .18s ease;}
.pb-navigationsmenue-hat-kinder:hover > a .pb-navigationsmenue-indikator,
.pb-navigationsmenue-hat-kinder.pb-navigationsmenue-untermenue-offen > a .pb-navigationsmenue-indikator{transform:rotate(180deg);}
.pb-navigationsmenue-untermenue{position:absolute;top:100%;left:0;z-index:40;display:flex;flex-direction:column;min-width:200px;padding:8px;margin:0;list-style:none;background:#ffffff;border-radius:10px;box-shadow:0 12px 32px rgba(15,23,42,.14);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px);transition:opacity .18s ease,transform .18s ease,visibility .18s ease;}
.pb-navigationsmenue-untermenue .pb-navigationsmenue-untermenue{top:0;left:100%;}
.pb-navigationsmenue-untermenue .pb-navigationsmenue-eintrag > a{display:block;padding:8px 12px;border-radius:6px;white-space:nowrap;}
.pb-navigationsmenue-hat-kinder:hover > .pb-navigationsmenue-untermenue,
.pb-navigationsmenue-hat-kinder.pb-navigationsmenue-untermenue-offen > .pb-navigationsmenue-untermenue,
.pb-navigationsmenue-hat-kinder:focus-within > .pb-navigationsmenue-untermenue{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0);}

/* Hamburger-Umschalter (Mobil-Menü) - per Voreinstellung ausgeblendet,
   das dynamische Block-CSS blendet ihn gezielt ein (siehe
   pagetal_pb_navigationsmenue_block_css()/pbNavigationsmenueBlockCssBauen()),
   sobald "design.mobil.aktiv" true ist UND die Fensterbreite den
   gewählten Breakpoint unterschreitet. Öffnen/Schliessen-Verhalten:
   assets/js/navigationsmenue-mobil.js (nur öffentliche Seite, im Editor
   bewusst ohne Funktion - siehe pbNavigationsmenueUmschalterInEditorHinweis()
   in assets/js/page-builder.js). */
.pb-navigationsmenue-umschalter{display:none;flex-direction:column;justify-content:center;align-items:center;gap:5px;width:34px;height:34px;padding:0;border:none;background:transparent;cursor:pointer;flex-shrink:0;}
.pb-navigationsmenue-umschalter:not(.pb-navigationsmenue-umschalter-icon) span{display:block;width:22px;height:2px;border-radius:2px;background:var(--navy);transition:transform .18s ease,opacity .18s ease;}
.pb-navigationsmenue-offen .pb-navigationsmenue-umschalter:not(.pb-navigationsmenue-umschalter-icon) span:nth-child(1){transform:translateY(7px) rotate(45deg);}
.pb-navigationsmenue-offen .pb-navigationsmenue-umschalter:not(.pb-navigationsmenue-umschalter-icon) span:nth-child(2){opacity:0;}
.pb-navigationsmenue-offen .pb-navigationsmenue-umschalter:not(.pb-navigationsmenue-umschalter-icon) span:nth-child(3){transform:translateY(-7px) rotate(-45deg);}
/* Ab v1.19.15 (Stephans Wunsch nach einem wählbaren Umschalter-Icon,
   siehe ausführlicher Docblock bei pagetal_pb_navigationsmenue_rendern()
   in includes/page-builder.php): "geschlossen"-Icon standardmässig
   sichtbar, "geöffnet" (X) ausgeblendet - sobald das <nav> die bereits
   bestehende ".pb-navigationsmenue-offen"-Klasse trägt (identischer
   Mechanismus wie beim klassischen Balken-Umschalter oben), tauschen
   beide einfach die Sichtbarkeit. "display:flex" (statt "block") zentriert
   das SVG-Icon exakt innerhalb seines Span, unabhängig von dessen
   Zeilenhöhe. */
.pb-navigationsmenue-umschalter-icon .pb-navigationsmenue-umschalter-symbol-auf{display:none;}
.pb-navigationsmenue-umschalter-icon .pb-navigationsmenue-umschalter-symbol-zu{display:flex;align-items:center;justify-content:center;color:var(--navy);}
.pb-navigationsmenue-offen .pb-navigationsmenue-umschalter-icon .pb-navigationsmenue-umschalter-symbol-zu{display:none;}
.pb-navigationsmenue-offen .pb-navigationsmenue-umschalter-icon .pb-navigationsmenue-umschalter-symbol-auf{display:flex;align-items:center;justify-content:center;color:var(--navy);}

/* ---------- Editor-Zustände (nur innerhalb der Builder-Leinwand aktiv) ---------- */

/* Oberer Innenabstand der Leinwand-Wurzel: schafft Platz für die
   Floating-Toolbar (Bearbeiten/Duplizieren/Löschen) des jeweils
   OBERSTEN Bausteins auf der Seite. Die Toolbar hängt per
   "top:-38px" über ihrem Baustein (siehe .pb-floating-toolbar unten);
   ohne diesen Abstand würde sie beim allerersten Baustein über den
   oberen Rand der (bewusst "overflow:hidden" gesetzten) Leinwand-Karte
   hinausragen und dadurch unsichtbar UND unklickbar werden – die
   Knöpfe Bearbeiten/Duplizieren/Löschen liessen sich dann für diesen
   einen Baustein nicht mehr erreichen. #pb-wurzel existiert
   ausschliesslich innerhalb der Shadow-DOM-Leinwand des Builders
   (siehe page-builder.js) und damit nie auf der öffentlichen Website. */
#pb-wurzel{padding-top:48px;}

/* Container-Rahmen: IMMER sichtbare, dezente gestrichelte Umrandung um
   JEDEN Container (nicht erst bei Auswahl) – ohne sie war in der
   Leinwand kaum erkennbar, wo ein Container anfängt/aufhört (Nutzer-
   Feedback: "ich sehe nicht, wo der Container anfängt und wo er
   aufhört, außer ich klicke"). Bewusst eine eigene, nur vom Editor
   gesetzte Klasse (siehe pbBlockHtml() in page-builder.js) statt direkt
   an .pb-container gehängt – .pb-container wird nämlich AUCH auf der
   öffentlichen Seite gerendert (siehe pagetal_pb_container_rendern()),
   dort darf diese Editor-Hilfslinie nie erscheinen. .pb-auswahl (unten)
   überschreibt sie bei Auswahl mit dem kräftigeren Auswahl-Rahmen, da
   diese Regel im Stylesheet weiter oben steht (bei gleicher Spezifität
   gewinnt die später stehende Regel). */
.pb-container-rahmen{outline:1.5px dashed rgba(6,21,41,.16);outline-offset:-1.5px;}

/* Auswahl-Rahmen: gestrichelte Umrandung um den aktuell ausgewählten
   Baustein, per box-shadow statt outline umgesetzt, damit sie nicht
   den Innenabstand des Bausteins verschiebt. */
.pb-auswahl{outline:2px dashed var(--backend-primaer, #244F4B);outline-offset:-2px;}

/* Ausgeblendet: über das Auge-Symbol im Struktur-Baum markierte
   Bausteine (siehe pbSichtbarkeitUmschalten() in page-builder.js)
   bleiben in der Leinwand weiterhin voll bearbeitbar, werden aber
   deutlich abgeblendet + schraffiert dargestellt, damit klar ist: auf
   der veröffentlichten Seite erscheinen sie NICHT (siehe
   pagetal_pb_baum_rendern() im Backend, das sie komplett überspringt). */
.pb-ausgeblendet{
  opacity:.4;
  background-image:repeating-linear-gradient(135deg, rgba(6,21,41,.06) 0 8px, transparent 8px 16px);
}

/* Drop-Zone: der jeweilige Container-Innenbereich, in den ein
   Baustein aktuell per Drag hineingezogen werden kann. */
[data-pb-dropzone]{min-height:56px;transition:background-color .12s ease,outline-color .12s ease;}
.pb-dropzone-aktiv{background-color:rgba(30,170,103,.08);outline:2px dashed var(--gruen, #1EAA67);outline-offset:-2px;border-radius:6px;}
.pb-dropzone-verboten{outline:2px dashed var(--rot-akzent, #CC092A);outline-offset:-2px;cursor:not-allowed;}

/* Einfüge-Indikator: schmaler Balken zwischen zwei Geschwister-
   Bausteinen, zeigt exakt an, wo der gezogene Baustein landen würde. */
.pb-einfuege-indikator{height:3px;margin:6px 0;border-radius:2px;background:var(--gruen, #1EAA67);box-shadow:0 0 0 3px rgba(30,170,103,.18);pointer-events:none;}
/* Ab v1.19.29 (Folge-Beobachtung beim Testen des obigen Bug-Reports):
   OHNE eigene Breite füllt der liegende Balken die Quer-Achse eines
   Flex-Containers normalerweise automatisch aus (Standard-
   "align-items:stretch"). Header-/Footer-/Topbar-/Bottombar-Spalten
   setzen als VORGABE aber "align-items:center" (siehe
   pagetal_pb_spalten_je_spalte_css()/pbSpaltenJeSpalteCss(), Fallback
   ohne eigene Werkzeugleisten-Einstellung) - innerhalb einer solchen
   Spalte würde der leere, breitenlose Indikator-Div dadurch NICHT
   gestreckt, sondern auf seine (leere -> 0px) Inhaltsbreite
   zusammenfallen und mittig "verschwinden". Bei Richtung "Spalte"
   (siehe pbDropzoneIstZeile()) wird der liegende Balken jetzt deshalb
   in genau diesen vier Spalten-Kontexten explizit auf volle Breite
   gestreckt - unabhängig von der jeweils gewählten "Elemente
   ausrichten"-Einstellung dieser Spalte. */
.pb-topbar-spalte > .pb-einfuege-indikator:not(.pb-einfuege-indikator-zeile),
.pb-header-spalte > .pb-einfuege-indikator:not(.pb-einfuege-indikator-zeile),
.pb-bottombar-spalte > .pb-einfuege-indikator:not(.pb-einfuege-indikator-zeile),
.pb-footer-spalte > .pb-einfuege-indikator:not(.pb-einfuege-indikator-zeile){align-self:stretch;}

/* Ab v1.19.30 (Stephans Rückfrage nach v1.19.29: "ist die gleiche Technik
   überall genau so wie jetzt im Footer?"): der generische Mehrspalten-
   Baustein "Container" im Raster-Modus (Klasse "pb-spalten-N" auf der
   Dropzone selbst, siehe pagetal_pb_container_block_css()) bekam bisher
   NIE die stehende Balken-Form, weil pbEinfuegeIndikatorAnzeigen()
   (page-builder.js) nur die vier Spalten-Kontexte oben abfragte - beim
   Ziehen zwischen zwei nebeneinander liegenden Raster-Spalten erschien
   der Indikator dadurch liegend/breit statt stehend/schmal, obwohl die
   Spalten eindeutig nebeneinander stehen (dieselbe falsche Anzeige wie
   der ursprüngliche Header/Footer-Bug vor v1.19.29, hier aber bisher
   unentdeckt). JS setzt die Klasse ".pb-einfuege-indikator-zeile" jetzt
   auch hier (siehe pbDropzoneMehrspaltig() in page-builder.js) - anders
   als bei den vier Spalten-Kontexten ist hierfür keine eigene "Basis
   liegend, MIT :not() ausgenommen"-Regel nötig: ".container" nutzt als
   Vorgabe bereits "align-items:stretch" (siehe
   pagetal_pb_container_block_css()), der liegende Basis-Balken oben
   bleibt dadurch von Haus aus sichtbar (kein 0px-Breite-Folgefehler wie
   bei den vier Spalten-Kontexten mit ihrer abweichenden
   "align-items:center"-Vorgabe).
   Zusätzlich (per Playwright-Test aufgefallen, NICHT bei den vier
   Spalten-Kontexten nötig): ".container > *" trägt bereits eine eigene,
   generische Regel, die JEDEM direkten Kind eine feste "flex-basis" aus
   der konfigurierten Spaltenbreite gibt (siehe
   pagetal_pb_container_block_css(), Raster-Spaltenaufteilung) - das trifft
   auch auf den hier frisch eingefügten Indikator-Div, dessen Hauptachsen-
   Grösse in einem Reihen-Flexbox dadurch von "flex-basis" bestimmt wird,
   NICHT von "width" (Flexbox-Standardverhalten: "width" wirkt nur, wenn
   "flex-basis" "auto" bleibt). Ohne explizites "flex:0 0 3px" hier bliebe
   der Indikator trotz "width:3px" auf voller Spaltenbreite - "flex:0 0
   3px" setzt die Hauptachsen-Grösse direkt und macht "width" überflüssig.
   Dieselbe generische Regel setzt zusätzlich ein festes "min-width" (die
   konfigurierte Mindestbreite je Spalte) auf jedes Kind - ein Flex-Item
   kann laut Spezifikation nie unter sein eigenes "min-width" schrumpfen,
   selbst mit "flex-shrink:0" und kleiner "flex-basis" nicht. Ohne den
   Reset unten bliebe der Indikator trotz "flex:0 0 3px" auf die geerbte
   Spalten-Mindestbreite aufgebläht - "min-width:0" hebt sie gezielt fuer
   den Indikator wieder auf. */
.container > .pb-einfuege-indikator.pb-einfuege-indikator-zeile{height:28px;flex:0 0 3px;min-width:0;align-self:center;margin:0 6px;}

/* Leer-Hinweis: erscheint nur im Editor in einer Drop-Zone ohne
   Kind-Bausteine – NIE serverseitig gerendert (siehe Docblock von
   pagetal_pb_container_rendern() in includes/page-builder.php). */
.pb-leer-hinweis{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:34px 16px;color:#9aa3ad;font-size:.84rem;text-align:center;border:1.5px dashed #d7dce1;border-radius:8px;pointer-events:none;}
.pb-leer-hinweis svg{opacity:.6;}

/* Ab v1.19.72 (Baustein "Vorlage", siehe includes/baustein-vorlagen.php):
   identisches Muster wie .pb-leer-hinweis oben, NUR im Editor sichtbar
   (siehe pbBlockHtml() in page-builder.js) - "-fehler" (gelöschte
   Vorlage/Zyklus) nutzt dieselbe Warnfarbe wie .pb-status-warnung
   (page-builder.css). */
.pb-vorlage-baustein-hinweis{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:34px 16px;color:#9aa3ad;font-size:.84rem;text-align:center;border:1.5px dashed #d7dce1;border-radius:8px;pointer-events:none;}
.pb-vorlage-baustein-hinweis svg{opacity:.6;}
.pb-vorlage-baustein-hinweis-fehler{color:#7a5b00;border-color:#e8c766;background:#fff6e0;}

/* Anhängen-Zeile: schmale, IMMER sichtbare Ziehen-Zone ausschliesslich
   am Ende der Seiten-Wurzel (nicht zu verwechseln mit .pb-leer-hinweis
   oben, der bei komplett LEEREN Ebenen erscheint – auch innerhalb von
   Containern). Bewusst NICHT zusätzlich am Ende jedes bereits gefüllten
   Containers, sonst gäbe es sie in jeder Verschachtelungsebene erneut –
   Bausteine lassen sich in gefüllte Container weiterhin ganz normal per
   Drag&Drop (die [data-pb-dropzone] bleibt dort unabhängig aktiv) oder
   über den Struktur-Baum einfügen. Nimmt neue Bausteine per Drag&Drop
   entgegen als auch einen Klick auf den "+"-Knopf, der eine kleine
   Baustein-Auswahl öffnet (siehe pbAnhaengenKlick() in page-builder.js)
   – entspricht dem aus Elementor bekannten Verhalten. */
.pb-anhaengen-zeile{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;margin-top:8px;border:1.5px dashed #d7dce1;border-radius:8px;color:#9aa3ad;font-size:.76rem;transition:.12s ease;}
.pb-anhaengen-plus{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--hellgrau-1);color:var(--backend-primaer, #244F4B);flex:none;cursor:pointer;pointer-events:auto;transition:.12s ease;}
.pb-anhaengen-plus:hover{background:var(--backend-primaer, #244F4B);color:#fff;}
.pb-anhaengen-zeile:hover,.pb-dropzone-aktiv > .pb-anhaengen-zeile{border-color:var(--backend-primaer, #244F4B);color:var(--backend-primaer, #244F4B);}

/* Ab v1.19.1 (Stephans Bug-Report, Punkte 2+3): sowohl die "Widget
   hierher ziehen"-Zeile als auch der grüne Einfüge-Indikator wurden
   ausschliesslich für den NORMALEN Fall entworfen, dass eine Drop-Zone
   ihre Kind-Bausteine UNTEREINANDER (Block-Fluss) anordnet - genau das
   trifft auf ".pb-topbar-spalte" nicht zu, die (siehe
   pagetal_pb_header_topbar_css() im Backend) selbst "display:flex" ohne
   eigene "flex-direction" ist, ihre Kinder also NEBENEINANDER (Reihe)
   anordnet. Zwei konkrete Folgefehler dadurch:
   1) ".pb-anhaengen-zeile" bekommt in einer Reihen-Anordnung kein
      "flex-shrink:0" und schrumpft dadurch unter ihre eigentliche
      Inhaltsgrösse, sobald die Spalte (z.B. durch ein bereits
      eingefügtes, seit v1.19.1 "flex:1 1 auto" tragendes Icon-Liste-
      Widget, siehe oben) nicht mehr genug Platz übrig lässt - Text und
      Icon wirken dadurch gequetscht/"nicht optimal angezeigt". Ihr
      "margin-top:8px" (gedacht als vertikaler Abstand zum block
      darüber) erzeugt ausserdem in einer Reihen-Anordnung mit
      "align-items:center" einen unnötigen vertikalen Versatz nach
      unten. "flex-shrink:0" verhindert das Schrumpfen (dank
      "flex-wrap:wrap" auf ".pb-topbar-spalte" rutscht die Zeile bei
      Platzmangel stattdessen einfach in die nächste Zeile um, statt
      gequetscht zu werden); "margin-top:0" überlässt den Abstand
      zwischen mehreren Zeilen dem bereits vorhandenen "gap:12px" der
      Spalte selbst.
   2) ".pb-einfuege-indikator" wird von pbEinfuegeIndikatorAnzeigen() als
      GESCHWISTER-ELEMENT direkt zwischen die vorhandenen Kind-Bausteine
      eingefügt - in einer Reihen-Anordnung wird er dadurch selbst zu
      einem Flex-Item OHNE Inhalt. Sein "height:3px" beschreibt zwar
      weiterhin die (jetzt falsche) Quer-Achse, seine tatsächlich
      sichtbare Breite entlang der Haupt-Achse bleibt aber mangels
      Inhalt und ohne "width" bei praktisch 0px - der Balken existiert
      technisch, ist aber unsichtbar schmal ("keine grüne Linie beim
      Ziehen in die Topbar" laut Bug-Report). Innerhalb einer
      Topbar-Spalte drehen wir ihn deshalb zu einem vertikalen Balken:
      "width" statt "height" gibt die sichtbare Ausdehnung vor. Ein
      erster Versuch mit "align-self:stretch" schlug beim Playwright-Test
      fehl, sobald der Indikator (wegen "flex-wrap:wrap") als einziges
      Element in eine EIGENE, neue Zeile rutscht: ohne eigenen Inhalt hat
      er dort keine Quer-Achsen-Grösse zum "Strecken" - die Zeile
      kollabiert auf 0px Höhe (leeres Div misst hypothetisch 0px, "stretch"
      streckt dann auf ebendiese 0px). Eine feste "height" behebt das,
      unabhängig davon, auf welcher Zeile der Indikator gerade landet;
      28px orientiert sich an der typischen Icon-Liste-Zeilenhöhe in der
      Topbar (Icon-Grösse 20px + etwas Luft). "margin:0 6px" ersetzt den
      ursprünglichen vertikalen durch einen horizontalen Abstand zu den
      Nachbar-Elementen, "align-self:center" zentriert ihn vertikal
      innerhalb seiner Zeile.
   Ausserhalb von ".pb-topbar-spalte" (der normale, block-fliessende
   Fall auf der Seiten-Wurzel und in Containern) bleiben beide Elemente
   durch die Scope-Selektoren unverändert - keine Design-Änderung
   ausserhalb des gemeldeten Fehlerfalls. */
.pb-topbar-spalte > .pb-anhaengen-zeile{flex-shrink:0;margin-top:0;}
/* Ab v1.19.29 (Stephans Bug-Report, mit Whiteboard-Skizze): dieser
   stehende Balken ist NUR korrekt, wenn die Spalte ihre Kinder aktuell
   tatsächlich NEBENEINANDER anordnet - seit die Richtung je Spalte per
   Flexbox-Werkzeugleiste umstellbar ist (ab v1.19.26), kann eine
   Topbar-Spalte auch auf "Spalte" (untereinander) stehen. Deshalb NICHT
   mehr bedingungslos auf ".pb-topbar-spalte > .pb-einfuege-indikator",
   sondern nur noch, wenn pbEinfuegeIndikatorAnzeigen() (page-builder.js,
   siehe pbDropzoneIstZeile()) die zusätzliche Klasse
   ".pb-einfuege-indikator-zeile" gesetzt hat, weil die TATSÄCHLICH
   gerenderte Richtung gerade row/row-reverse ist. Ohne diese Klasse
   (Richtung "Spalte") bleibt die liegende Basis-Regel oben
   (".pb-einfuege-indikator") aktiv - exakt der optisch passende, liegende
   Balken für untereinander gestapelte Bausteine. */
.pb-topbar-spalte > .pb-einfuege-indikator.pb-einfuege-indikator-zeile{height:28px;width:3px;align-self:center;margin:0 6px;flex-shrink:0;}

/* Ab v1.19.23 (Umbau auf echte Spalten-Wrapper, siehe
   pagetal_pb_spalte_bereinigen()): bis v1.19.22 hatte ".pb-header-innen"
   selbst KEINE Spalten-Wrapper-Elemente (die "Widget hierher ziehen"-Zeile
   landete dadurch als direktes Grid-/Flex-Kind der Header-Innen-Hülle) -
   dieselbe Zeile lebt jetzt INNERHALB von ".pb-header-spalte" (siehe
   pagetal_pb_spalten_html()), einer selbst "display:flex" ohne eigene
   "flex-direction" flexenden Spalte (Kinder also NEBENEINANDER statt
   untereinander) - 1:1 dieselbe Korrektur wie bereits bei
   ".pb-topbar-spalte" weiter oben (siehe dortiger ausführlicher Docblock
   für die volle Begründung von "flex-shrink:0"/dem vertikalen
   Einfüge-Balken). */
.pb-header-spalte > .pb-anhaengen-zeile{flex-shrink:0;margin-top:0;}
/* Ab v1.19.29: dieselbe Bedingung wie bei ".pb-topbar-spalte" weiter
   oben (siehe dortiger ausführlicher Docblock) - nur bei tatsächlich
   nebeneinander angeordneten Kindern (Klasse
   ".pb-einfuege-indikator-zeile") wird der Indikator zum stehenden
   Balken, sonst bleibt er liegend. */
.pb-header-spalte > .pb-einfuege-indikator.pb-einfuege-indikator-zeile{height:28px;width:3px;align-self:center;margin:0 6px;flex-shrink:0;}

/* Floating-Toolbar: schwebt bei Auswahl OBERHALB der Baustein-Kante
   (top:-38px, siehe pbBausteinHuelle() in page-builder.js) – überdeckt
   dadurch nie den Inhalt. Zeigt seit dem Wegfall der Namens-Kennzeichnung
   auf der Leinwand (Nutzer-Feedback: verdeckte bisher den Inhalt) nur
   noch den Ziehen-Griff; Bearbeiten/Umbenennen/Duplizieren/Kopieren/
   Einfügen/Löschen laufen jetzt über das Rechtsklick-Kontextmenü (siehe
   .pb-kontextmenu unten, genau wie im Struktur-Baum). */
.pb-floating-toolbar{position:absolute;top:-38px;left:0;display:flex;align-items:center;gap:2px;background:var(--navy,#061529);border-radius:8px;padding:4px;box-shadow:0 8px 20px rgba(6,21,41,.25);z-index:50;}
.pb-greifer{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:5px;color:#fff;cursor:grab;opacity:.85;touch-action:none;}
.pb-greifer:hover{opacity:1;background:rgba(255,255,255,.14);}
.pb-greifer:active{cursor:grabbing;}

/* Ab v1.19.75 (Stephans Rückmeldung: "baustein cta kann im pagebuilder
   nicht per drag and drop verschoben werden"): der CTA-Baustein setzt
   auf seinem EIGENEN [data-pb-block-id]-Element bewusst "overflow:hidden"
   (siehe pagetal_pb_cta_block_css() in includes/page-builder.php) - damit
   übernimmt die optionale Unterleiste automatisch denselben unteren
   Eckenradius wie die Box selbst, ohne einen eigenen Radius berechnen zu
   müssen. Der Ziehen-Griff (".pb-floating-toolbar", "top:-38px", siehe
   oben) wird aber als Kind GENAU dieses Elements eingefügt (siehe
   pbBausteinHuelle()) und hängt bewusst 38px darüber - beim CTA-Baustein
   schneidet "overflow:hidden" ihn dadurch vollständig weg, er ist weder
   sichtbar noch anklickbar/ziehbar, obwohl bei jedem anderen Baustein-Typ
   ohne eigenes "overflow:hidden" identisch funktioniert.
   Eine Baustein-weite Aufteilung in Aussen-Box (Griff, kein Overflow) und
   Innen-Box (Overflow für die Eckenrundung) hätte eine strukturelle
   Änderung an der öffentlichen HTML/CSS-Ausgabe des CTA-Bausteins zur
   Folge (Markup + CSS-Erzeugung in PHP UND deren JS-Zwilling) - bewusst
   NICHT gemacht, um am öffentlich sichtbaren Design nichts zu verändern.
   Stattdessen wird "overflow:hidden" GEZIELT NUR während der Baustein in
   der Leinwand ausgewählt ist (Klasse ".pb-auswahl", siehe oben, wird
   exakt dann gesetzt, wenn auch der Ziehen-Griff überhaupt existiert)
   aufgehoben - rein im Editor, nie auf der öffentlichen Seite (diese
   Datei wird dort nicht geladen, siehe Docblock ganz oben in dieser
   Datei). Nebenwirkung: ist bei einem CTA-Baustein gleichzeitig ein
   eigener Eckenradius UND eine aktive Unterleiste eingestellt, zeigt die
   Unterleiste genau in dem Moment, in dem der Baustein ausgewählt ist,
   an den unteren Ecken keine Rundung mehr (die Box selbst bleibt
   gerundet) - sobald der Baustein wieder abgewählt wird, greift
   "overflow:hidden" erneut und die Rundung ist wieder exakt wie zuvor. */
.pb-cta.pb-auswahl{overflow:visible;}

/* Ab v1.19.77, GEGENSTANDSLOS GEWORDEN seit derselben Version (Historie
   stehen gelassen, falls die Struktur je wieder zurückgebaut wird): der
   Slider-Baustein setzte ursprünglich auf seiner eigenen Wurzel
   (".pb-slider") "overflow:hidden" (damit der Rand-Radius optisch auf
   die eckigen Folien durchschlägt) - das schnitt den 38px darüber
   schwebenden Ziehen-Griff (".pb-floating-toolbar", direktes Kind von
   ".pb-slider") vollständig weg, der Slider liess sich per Griff nicht
   mehr verschieben (Stephans Bug-Report). Erste Korrektur war eine zum
   CTA-Baustein oben identische, editor-only "overflow:visible"-Regel
   genau hier. Bei der GLEICHZEITIGEN Untersuchung eines zweiten,
   verwandten Bug-Reports ("abgerundete Ecken nur oben sichtbar bei
   Höhe:Fest", siehe ausführlicher Docblock bei
   pagetal_pb_slider_block_css()) stellte sich heraus, dass
   "overflow:hidden" ohnehin architektonisch am falschen Element sass
   (auf der äusseren Box statt auf einem die Folien eng umschliessenden
   Wrapper) - im Zuge dieser Korrektur wanderte "overflow:hidden" auf den
   NEUEN ".pb-slider-sichtbereich"-Wrapper (siehe
   pagetal_pb_slider_rendern()), der ein Geschwister-, kein Kind-Element
   des Ziehen-Griffs ist. ".pb-slider" selbst trägt seitdem gar kein
   "overflow:hidden" mehr - diese Regel hier hat daher aktuell keinerlei
   Wirkung mehr, wird aber bewusst nicht gelöscht (kein
   Funktionsentfernung ohne Not, und falls die Sichtbereich-Aufteilung je
   rückgängig gemacht würde, wäre der ursprüngliche Fehler sonst wieder
   da, ohne dass diese Doku-Spur noch auffindbar wäre). */
.pb-slider.pb-auswahl{overflow:visible;}

/* Umbenennen-Eingabefeld (.pb-baustein-label-eingabe) und die
   schwebende Umbenennen-Überlagerung (.pb-umbenennen-ueberlagerung)
   werden IMMER per document.createElement() im HAUPTdokument erzeugt
   (siehe pbUmbenennenStarten()/pbUmbenennenUeberlagerungStarten() in
   page-builder.js) – nie innerhalb der Leinwand selbst. Ihre Regeln
   stehen deshalb in page-builder.css (Admin-Chrome, dort auch
   tatsächlich geladen), nicht hier. */

/* Ab v1.18.2: Bausteine "Logo" und "Header" - Basis-Markup, die
   Feineinstellungen kommen aus dem dynamischen Block-CSS (siehe
   pagetal_pb_logo_block_css()/pagetal_pb_header_block_css()).
   Ab v1.19.23 (Stephans Bug-Report: "logo kann im nicht per drag and
   drop im pagebuilder verschoben werden") - derselbe, bereits fünfmal
   dokumentierte Fehlertyp wie bei Sammlungstypen-Feld (v1.17.35),
   Seitentitel/Breadcrumb (v1.17.54), Navigationsmenü (v1.18.0) und
   Icon-Liste (v1.19.1): ".pb-logo" bekam beim Anlegen in v1.18.2 nie
   ein eigenes "position:relative" - der im Editor eingeblendete
   schwebende Ziehen-Greifer (".pb-floating-toolbar",
   "position:absolute;top:-38px") positionierte sich dadurch relativ
   zum nächsten POSITIONIERTEN VORFAHREN statt relativ zum Logo-Baustein
   selbst und liess sich praktisch nicht mehr treffen. Fix:
   "position:relative" ergänzt - auf der öffentlichen Seite ohne jede
   sichtbare Auswirkung (kein ".pb-floating-toolbar" ausserhalb des
   Editors). */
.pb-logo{display:flex;position:relative;}
.pb-logo-link{display:inline-flex;align-items:center;gap:10px;text-decoration:none;}
.pb-logo-bild{display:block;max-width:100%;height:auto;}
.pb-logo-beschriftung{font-weight:600;color:var(--navy);}
.pb-header{position:relative;}

/* Ab v1.19.22 (Footer-Baustein): 1:1 dieselbe Basis-Regel wie
   ".pb-header" oben - siehe dortiger Docblock/Checkliste (jeder neue
   Page-Builder-Baustein MUSS auf seinem äussersten, tatsächlich
   befüllten Wurzelelement "position:relative" tragen, sonst landet der
   schwebende Ziehen-Greifer des Editors relativ zum falschen Vorfahren
   und ist praktisch nicht mehr treffbar). */
.pb-footer{position:relative;}

/* Ab v1.19.45 (Baustein "Bild"): 1:1 dieselbe Basis-Regel wie ".pb-logo"/
   ".pb-header"/".pb-footer" oben - siehe dortiger Docblock/Checkliste
   (jeder neue Page-Builder-Baustein MUSS auf seinem äussersten,
   tatsächlich befüllten Wurzelelement "position:relative" tragen, sonst
   landet der schwebende Ziehen-Greifer des Editors relativ zum falschen
   Vorfahren und ist praktisch nicht mehr treffbar). "margin:0" räumt den
   Browser-Standardabstand von "<figure>" auf (Logo nutzt dafür ein
   "<div>" ohne diesen UA-Standardabstand) - das tatsächliche Aussen-
   abstand-Verhalten kommt ohnehin ausschliesslich aus dem dynamischen
   Block-CSS (siehe pagetal_pb_bild_block_css()/pbBildBlockCssBauen()).
   ".pb-bild-bild" bekommt "max-width:100%;height:auto;" als sinnvolle
   Basis (verhindert ein unkontrolliert breites Bild, BEVOR das
   dynamische Block-CSS geladen ist) - "display:block" selbst kommt
   ebenfalls bereits aus dem dynamischen CSS. */
.pb-bild{position:relative;margin:0;}
.pb-bild-bild{max-width:100%;height:auto;}
.pb-bild-link{display:inline-flex;}

/* Ab v1.19.52 (Baustein "Galerie"): 1:1 dieselbe Basis-Regel wie
   ".pb-bild" direkt oberhalb (siehe dortiger Docblock/Checkliste - jeder
   neue Page-Builder-Baustein MUSS auf seinem äussersten, tatsächlich
   befüllten Wurzelelement "position:relative" tragen). ".pb-galerie-bild"
   bekommt "max-width:100%;height:auto;" als sinnvolle Basis, BEVOR das
   dynamische Block-CSS geladen ist (siehe pagetal_pb_galerie_block_css()/
   pbGalerieBlockCssBauen()) - in den Layouts "Gitter"/"Masonry" mit
   festem Seitenverhältnis sowie im Layout "Blocksatz" überschreibt das
   dynamische CSS "height" anschliessend gezielt wieder auf "100%"
   (Kachel-Höhe), hier geht es nur um den unkontrolliert grossen
   Erst-Zustand ohne jedes Block-CSS. */
.pb-galerie{position:relative;margin:0;}
.pb-galerie-bild{max-width:100%;height:auto;}

/* Baustein "Trenner" (Basis-Set): 1:1 dieselbe Basis-Regel wie ".pb-bild"/
   ".pb-galerie" direkt oberhalb (siehe dortiger Docblock/Checkliste -
   jeder neue Page-Builder-Baustein MUSS auf seinem äussersten, tatsächlich
   befüllten Wurzelelement "position:relative" tragen, sonst landet der
   schwebende Ziehen-Greifer des Editors relativ zum falschen Vorfahren und
   ist praktisch nicht mehr treffbar). Zusätzlicher, Trenner-spezifischer
   Grund: das Feld "Z-Index" (Tab "Erweitert", siehe
   pagetal_pb_trenner_block_css()/pbTrennerBlockCssBauen()) erzeugt NUR bei
   Bedarf eine "z-index"-Deklaration - CSS wertet "z-index" aber laut
   Spezifikation überhaupt nur auf POSITIONIERTEN Elementen aus (alles
   ausser dem Standardwert "position:static"). Ohne dieses
   "position:relative" hier hätte das Feld trotz korrekt gespeichertem und
   sogar im berechneten Stil sichtbarem Wert (".zIndex" wird von Browsern
   z.T. auch auf statischen Elementen zurückgegeben, ohne dass er optisch
   irgendeine Wirkung entfaltet) in Wahrheit KEINERLEI sichtbaren Effekt.
   "margin:0 0 20px" ist bewusst nur der Fallback-Wert vor dem Laden des
   dynamischen Block-CSS (siehe dort) - identisch zum Aussenabstand-
   Standard anderer Text-nahe Bausteine (".pb-ueberschrift"/
   ".pb-texteditor" weiter oben), reproduziert also 0
   Verhaltensänderung für den bereits per Block-CSS abgedeckten Fall. */
.pb-trenner{position:relative;margin:0 0 20px;}

/* Bausteine "Icon"/"Icon-Box"/"Button" (ab v1.19.60): 1:1 dieselbe
   Basis-Regel wie ".pb-bild"/".pb-galerie"/".pb-trenner" oberhalb (siehe
   dortiger Docblock/Checkliste - "position:relative" + der Z-Index-
   Fallback-Grund gelten identisch für jeden neuen Baustein mit einem
   "Erweitert"-Tab). "margin:0 0 20px" als Fallback-Wert vor dem Laden des
   dynamischen Block-CSS (siehe pagetal_pb_icon_block_css()/
   pbIconBlockCssBauen(), pagetal_pb_icon_box_block_css()/
   pbIconBoxBlockCssBauen(), pagetal_pb_button_block_css()/
   pbButtonBlockCssBauen()).
   ".pb-icon-link"/".pb-icon-box-element" bekommen "display:inline-flex"/
   "flex-shrink:0" bereits als Basis, damit Icon bzw. Zahl auch vor dem
   Laden des dynamischen CSS nicht verzerrt/gequetscht erscheinen.
   ".pb-button" (IMMER zusätzlich zu "btn btn-primary" vorhanden, siehe
   pagetal_pb_button_rendern()) bekommt "position:relative" aus demselben
   Z-Index-/Ziehen-Greifer-Grund wie oben, aber bewusst KEINE eigene
   Optik-Basis (Hintergrund/Rand/Schrift/…) - die globale ".btn"/
   ".btn-primary"-Optik aus assets/css/frontend.css bzw. KONFIG.buttonsCss
   deckt die komplette Optik bereits ab, ein zusätzlicher Basiswert hier
   würde nur unnötig mit der Kaskade konkurrieren. "margin" kommt bei
   "Button" ausschliesslich aus dem dynamischen Block-CSS (Aussenabstand,
   siehe pagetal_pb_button_block_css()/pbButtonBlockCssBauen()), ohne
   eigenen Fallback-Wert hier. */
.pb-icon{position:relative;margin:0 0 20px;}
.pb-icon-link{display:inline-flex;text-decoration:none;}
.pb-icon-box{position:relative;margin:0 0 20px;}
.pb-icon-box-element{flex-shrink:0;}
.pb-button{position:relative;}

/* Baustein "Bilder-Box" (ab v1.19.102): 1:1 dieselbe Basis-Fallback-Regel
   wie ".pb-icon-box"/".pb-icon-box-element" direkt oberhalb (siehe dortiger
   Docblock - "position:relative" + Z-Index-Fallback-Grund gelten identisch,
   "margin:0 0 20px" nur als Fallback-Wert vor dem Laden des dynamischen
   Block-CSS, siehe pagetal_pb_bild_box_block_css()/pbBildBoxBlockCssBauen()).
   ".pb-bild-box-element" bekommt "flex-shrink:0" bereits als Basis, damit
   das Bild auch vor dem Laden des dynamischen CSS nicht gequetscht
   erscheint - bewusst OHNE "display:inline-flex" hier (anders als
   ".pb-icon-box-element"), weil die Bild-Breite selbst aus dem dynamischen
   CSS kommt (freie Breite statt fester Icon-Grösse, siehe Docblock bei
   pagetal_pb_bild_box_einstellungen_standard() in includes/page-builder.php). */
.pb-bild-box{position:relative;margin:0 0 20px;}
.pb-bild-box-element{flex-shrink:0;}

/* Lightbox-Overlay des Bausteins "Galerie" (siehe
   assets/js/galerie-lightbox.js) - ein einziges, gemeinsam von ALLEN
   Galerien der Seite genutztes Overlay-Element, das erst beim ersten
   Klick auf ein Lightbox-Bild erzeugt wird (siehe "overlayErzeugen()"
   dort). Bewusst ohne Abhängigkeit von einer bestimmten Galerie-Kachel -
   "position:fixed" deckt das gesamte Sichtfenster ab, unabhängig davon,
   wo im Seitenfluss die auslösende Galerie steht. */
.pb-galerie-lightbox-overlay{
  position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;
  background:rgba(6,21,41,.92);opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .25s ease,visibility .25s ease;padding:40px;box-sizing:border-box;
}
.pb-galerie-lightbox-overlay-aktiv{opacity:1;visibility:visible;pointer-events:auto;}
.pb-galerie-lightbox-figur{position:relative;margin:0;max-width:90vw;max-height:90vh;display:flex;flex-direction:column;align-items:center;}
.pb-galerie-lightbox-bild{display:block;max-width:90vw;max-height:80vh;width:auto;height:auto;border-radius:4px;box-shadow:0 20px 60px rgba(0,0,0,.4);}
.pb-galerie-lightbox-beschriftung{color:#fff;margin-top:14px;font-size:.9rem;text-align:center;max-width:70vw;}
.pb-galerie-lightbox-beschriftung:empty{display:none;}
.pb-galerie-lightbox-schliessen,
.pb-galerie-lightbox-zurueck,
.pb-galerie-lightbox-weiter{
  position:fixed;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.12);
  color:#fff;border:none;border-radius:50%;cursor:pointer;font-size:1.6rem;line-height:1;transition:background .15s ease;
}
.pb-galerie-lightbox-schliessen:hover,
.pb-galerie-lightbox-zurueck:hover,
.pb-galerie-lightbox-weiter:hover{background:rgba(255,255,255,.28);}
.pb-galerie-lightbox-schliessen{top:20px;right:20px;width:44px;height:44px;font-size:1.4rem;}
.pb-galerie-lightbox-zurueck{left:20px;top:50%;transform:translateY(-50%);width:52px;height:52px;}
.pb-galerie-lightbox-weiter{right:20px;top:50%;transform:translateY(-50%);width:52px;height:52px;}
@media (max-width:640px){
  .pb-galerie-lightbox-overlay{padding:16px;}
  .pb-galerie-lightbox-zurueck,.pb-galerie-lightbox-weiter{width:40px;height:40px;font-size:1.2rem;}
  .pb-galerie-lightbox-schliessen{width:36px;height:36px;top:10px;right:10px;}
}

/* Ab v1.19.22 (Footer-Baustein): 1:1 dieselbe "Widget hierher
   ziehen"-Zeile/Einfüge-Indikator-Korrektur wie bei ".pb-topbar-spalte"
   weiter oben, nur für die neue Bottombar-Spalte (ebenfalls
   "display:flex" ohne eigene "flex-direction", Kinder also
   NEBENEINANDER statt untereinander - siehe dortiger ausführlicher
   Docblock für die volle Begründung). */
.pb-bottombar-spalte > .pb-anhaengen-zeile{flex-shrink:0;margin-top:0;}
/* Ab v1.19.29: dieselbe Bedingung wie bei ".pb-topbar-spalte" weiter
   oben (siehe dortiger ausführlicher Docblock). */
.pb-bottombar-spalte > .pb-einfuege-indikator.pb-einfuege-indikator-zeile{height:28px;width:3px;align-self:center;margin:0 6px;flex-shrink:0;}

/* Ab v1.19.23: 1:1 dieselbe Korrektur wie bei ".pb-header-spalte" weiter
   oben, nur für die Footer-eigenen Spalten (".pb-footer-spalte"). */
.pb-footer-spalte > .pb-anhaengen-zeile{flex-shrink:0;margin-top:0;}
/* Ab v1.19.29: dieselbe Bedingung wie bei ".pb-topbar-spalte" weiter
   oben (siehe dortiger ausführlicher Docblock). */
.pb-footer-spalte > .pb-einfuege-indikator.pb-einfuege-indikator-zeile{height:28px;width:3px;align-self:center;margin:0 6px;flex-shrink:0;}

/* Ab v1.19.152 (Stephans Meldung: "Kontaktformular-Baustein lässt sich im
   Page-Builder nicht per Drag&Drop verschieben") - exakt derselbe, bereits
   mehrfach dokumentierte Fehlertyp wie bei Sammlungstypen-Feld (v1.17.35),
   Seitentitel/Breadcrumb (v1.17.54), Navigationsmenü (v1.18.0), Icon-Liste
   (v1.19.1) und Logo (v1.19.23): ".pb-kontaktformular" bekam bei der
   Einführung des Bausteins (v1.19.148) nie ein eigenes "position:relative" -
   der im Editor eingefügte schwebende Ziehen-Griff (".pb-floating-toolbar",
   "position:absolute;top:-38px") positionierte sich dadurch relativ zum
   nächsten POSITIONIERTEN VORFAHREN (Leinwand-Wurzel) statt relativ zum
   Formular, landete weit entfernt und war nicht treffbar. Zusätzlich setzt
   pagetal_pb_kontaktformular_block_css() (PHP+JS) dieselbe Regel jetzt auch
   im Block-CSS (nötig, damit "Z-Index" im Tab Erweitert wirkt). Auf der
   öffentlichen Seite ohne sichtbare Auswirkung (kein ".pb-floating-toolbar"
   ausserhalb des Editors). */
.pb-kontaktformular{position:relative;}
