diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index a6d3c08..92ba1fb 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -458,6 +458,8 @@ Umut: „es gibt keinen Mausover-Effekt wenn man auf einen Beitrag geht, das feh **Nebenbei entfernt:** der Leuchteffekt (`fx-hover-glow`) trug noch das Grün der Vorlage statt der Akzentfarbe der Website. +**Nachgetragen am 13.09.2026:** Umut meinte den Kopf **beim Öffnen eines Beitrags**, nicht den der Startseite. Im Original füllt dort das Projektbild den ganzen Kopf (75 vh), darüber liegt ein Verlauf von fast durchsichtig oben nach fast deckend unten, und darin stehen ein Badge in der Akzentfarbe, der Titel und eine 60 × 4 Pixel kurze Linie. Nachgebaut mit den vorhandenen Mitteln – Hintergrundbild, Verlauf, Flexausrichtung –, der Text mittig gesetzt. Dabei fiel auf, dass die Zeile mit Datum, Autor und Kategorie oberhalb davon stand: bei einem Beitrag, der seinen Titel im Bild trägt, ist sie doppelt. Sie ist jetzt abschaltbar (`postMetaHeader`), Voreinstellung bleibt an. + ## ADR 044 – Genauer hinsehen: Punkte statt Rollleiste, Karten statt Zeilen (13.09.2026) Umut hat den Nachbau Detail für Detail mit dem Original verglichen, und er hatte in jedem Punkt recht. Was dabei herauskam, sind nicht Geschmacksfragen, sondern vier Stellen, an denen das CMS etwas nicht konnte oder etwas Falsches tat. diff --git a/src/Content/SiteSettings.php b/src/Content/SiteSettings.php index 8767ea7..c8d2c26 100644 --- a/src/Content/SiteSettings.php +++ b/src/Content/SiteSettings.php @@ -27,6 +27,9 @@ final class SiteSettings // Der Kopfbereich bleibt beim Scrollen oben stehen. Eine Eigenschaft der Website und // nicht des Dokuments: kleben kann nur das Element, das den Bereich umschliesst. 'stickyHeader' => false, + // Datum, Autor und Kategorie über dem Beitrag. Aus, wenn der Beitrag seinen eigenen + // Kopf mitbringt - sonst steht die Zeile über einem Bild, das den Titel schon trägt. + 'postMetaHeader' => true, 'robotsExtra' => '', // Which stored page answers at the site root. Everything else derives from this. 'homePath' => 'home', @@ -97,6 +100,7 @@ final class SiteSettings } $values['llmsTxt'] = (bool) ($input['llmsTxt'] ?? false); $values['stickyHeader'] = (bool) ($input['stickyHeader'] ?? false); + $values['postMetaHeader'] = (bool) ($input['postMetaHeader'] ?? false); // Only comment and simple directive lines; nothing that could smuggle in a second policy. $extra = []; foreach (preg_split('/\R/', (string) ($input['robotsExtra'] ?? '')) ?: [] as $line) { diff --git a/templates/admin/settings.html.twig b/templates/admin/settings.html.twig index 0b3b781..0e7d007 100644 --- a/templates/admin/settings.html.twig +++ b/templates/admin/settings.html.twig @@ -74,6 +74,7 @@

Nur Kommentarzeilen und einfache Anweisungen wie Disallow: /pfad. Höchstens dreißig Zeilen.

Einwilligung

Nur nötig, wenn die Website etwas von Dritten lädt
+

Ohne eingebettete Inhalte anderer Anbieter braucht diese Website keine Einwilligung – dann ist ein Banner nur im Weg und sollte aus bleiben. Eingebettete Inhalte laden ohnehin erst nach Zustimmung, unabhängig von diesem Schalter.

diff --git a/templates/page.html.twig b/templates/page.html.twig index c1aeb73..252b85a 100644 --- a/templates/page.html.twig +++ b/templates/page.html.twig @@ -44,7 +44,7 @@ {% endif %}
- {% if postMeta is defined and postMeta is not null %} + {% 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 %} diff --git a/tests/CmsTest.php b/tests/CmsTest.php index 64e1444..a04e457 100644 --- a/tests/CmsTest.php +++ b/tests/CmsTest.php @@ -643,6 +643,14 @@ final class CmsTest extends TestCase self::assertStringContainsString('', $html); self::assertStringContainsString('alt="Firmenlogo"', $html); + // Datum, Autor und Kategorie über einem Beitrag lassen sich abschalten - ein Beitrag mit + // eigenem Kopfbild trägt den Titel schon, und die Zeile darüber steht dann im Weg. + $this->publishedPost('projekt', 'Ein Projekt', '2026-02-01', ['Projekte'], []); + self::assertStringContainsString('post-header', $this->request('/projekt')->getContent()); + $vorher = $this->site->load(); + $this->site->save([...$vorher, 'postMetaHeader' => false, 'sameAs' => '', 'consentGroups' => $vorher['consentGroups']]); + self::assertStringNotContainsString('post-header', $this->request('/projekt')->getContent()); + // Der Kopfbereich klebt erst, wenn die Einstellung es sagt. self::assertStringContainsString('class="site-header"', $html); $settings = $this->site->load();