{# Ohne Klasse spielt die Website Bewegung immer ab; mit ihr gilt die Browservorgabe. #} {# Der Titel fuer die Suche, sonst der Titel der Seite. #} {% set seoTitle = page.seo_title|default('') ?: page.document.title %} {{ seoTitle }} {% if canonical|default(null) %}{% endif %} {% if pagination|default(null) %}{% if pagination.page > 1 %}{% endif %}{% if pagination.page < pagination.pages %}{% endif %}{% endif %} {% if page.robots|default('index') != 'index' %}{% endif %} {% if canonical|default(null) %}{% endif %} {# In der Vorschau des Editors gibt es den Websitenamen nicht - dort fehlt das Feld einfach. #} {% if page.website_name|default('') %}{% endif %} {% if socialImage|default(null) %} {% if socialImage.alt %}{% endif %} {% else %} {# Ohne Bild ist die große Karte eine leere Fläche; die kleine zeigt Titel und Text. #} {% endif %} {% include 'favicon.html.twig' %} {# Ein Bündel statt vier Dateien: jede einzelne hält das Zeichnen der Seite auf. Fehlt es (kein Schreibrecht im Ordner), werden die Quellen einzeln geladen - langsamer, aber heil. #} {# Das grosse Bild ueber der Falz, wenn es der Hintergrund des ersten Abschnitts ist: Es steht sonst nur im Stylesheet und wird erst gefunden, wenn das geparst ist. Genau eine der drei Abfragen trifft zu - und zwar auf dieselbe Variante, die auch die Regel nimmt. #} {% for bild in heroBackground|default([]) %} {% endfor %} {# Und derselbe Dienst fuer das gewoehnliche Bild ueber der Falz: ohne diese Zeile faengt der Browser es erst an zu holen, wenn er das Stylesheet geparst hat. #} {% if heroImage|default(null) %} {% endif %} {% if localFonts|default([]) %} {# Jeder Schnitt, den das Theme nennt, vorab - und zwar alle. Fehlt einer, laedt er erst, wenn das Stylesheet geparst ist, und die Ueberschrift springt sichtbar von der Ersatzschrift auf die richtige. Schriften kommen ausschliesslich vom eigenen Server; ein Stylesheet von fonts.googleapis.com wird nie verlinkt. #} {% for font in localFonts %}{% endfor %} {% endif %} {% if styleBundle|default(null) %} {% else %} {% if localFonts|default([]) %}{% endif %} {% if page.document.schemaVersion >= 2 %}{% endif %} {% if page.document.schemaVersion >= 3 %}{% endif %} {% endif %} {% for href in pluginStyles|default([]) %}{% endfor %} {% if hasPosts|default(false) %} {% endif %} {% if needsTabs|default(false) %}{% endif %} {% if needsFormScript|default(false) and not editing|default(false) %}{% endif %} {% if needsSlider|default(false) %}{% endif %} {% if needsMotion|default(false) %}{% endif %} {% if needsScrolled|default(false) %}{% endif %} {% if needsZoom|default(false) %}{% endif %} {% if not editing|default(false) %}{% for src in pluginScripts|default([]) %}{% endfor %}{% endif %} {# Own scripts of this page, as a file. Never rendered in the editor preview: the preview must show the layout, not run code that could change the page under the editor's hands. #} {% if pageScript|default(null) and not editing|default(false) %}{% endif %} {% if not editing|default(false) %}{% for src in areaScripts|default([]) %}{% endfor %}{% endif %} {# A data block, not a script: CSP script-src does not apply to application/ld+json. #} {% for block in structuredData|default([]) %} {% endfor %} {% if pageStyles|default('') %} {# In the editor the preview inherits the administration's policy, which forbids inline styles. The stylesheet therefore travels as inert template text and the editor applies it as a constructed stylesheet – same result, no policy violation and a clean console. #} {% if editing|default(false) %} {% else %}{% endif %} {% endif %} {% set consentOpen = not editing|default(false) and consentGate.needsBanner(app.request) %} {# Header and footer are block documents like any page, so they are built from elements instead of being written into this template. #} {% if areas.header|default(null) %}
{% for block in areas.header.blocks %}{% include 'blocks/block.html.twig' with {block: block, editing: editing|default(false), postLists: postLists|default({}), forms: forms|default({}), breadcrumbs: breadcrumbs|default([]), navigation: navigation|default({}), sections: sections|default({}), richText: areas.header.schemaVersion|default(1) >= 12, richHeadings: areas.header.schemaVersion|default(1) >= 17, eagerImage: eagerImage|default(null), inHeader: true} only %}{% endfor %}
{% endif %}
{% if postMeta is defined and postMeta is not null and siteSettings.load().postMetaHeader %}

{% if page.published_at %}{% endif %} {% if page.author %}von {{ page.author }}{% endif %} {% for term in postMeta.category %}{{ term.name }}{% endfor %} {% for term in postMeta.tag %}{% endfor %}

{% endif %} {% for block in page.document.blocks %}{% include 'blocks/block.html.twig' with {block: block, editing: editing|default(false), postLists: postLists|default({}), forms: forms|default({}), breadcrumbs: breadcrumbs|default([]), navigation: navigation|default({}), sections: sections|default({}), richText: page.document.schemaVersion|default(1) >= 12, richHeadings: page.document.schemaVersion|default(1) >= 17, neighbours: neighbours|default({}), eagerImage: eagerImage|default(null)} only %}{% endfor %}
{% if areas.footer|default(null) %} {% endif %} {% if not editing|default(false) and consentGate.needsBanner(app.request) %} {% include 'consent-banner.html.twig' with {consent: consentGate.state(app.request), back: app.request.pathInfo} only %} {% endif %} {# Der Knopf steht hinter der Einwilligungsleiste: Solange sie offen ist, setzt er sich per Ankerpositionierung auf ihre Oberkante, und ein Anker muss im Dokument davor stehen. #} {% set oben = siteSettings.load() %} {% if oben.scrollTop|default(false) and not editing|default(false) %} {# Ein Anker, kein Skript. Er springt an den Anfang - das kann ein Browser allein. Der nav-Rahmen gibt ihm eine Landmarke: ein Verweis außerhalb jeder Landmarke ist für Vorlesesoftware Inhalt ohne Ort, und axe meldet ihn als Verstoß gegen „region“. #} {% endif %}