Alles aus dem Nachbau von kant-it.de, den Umut durchgesehen hat. Eine Beitragsliste kann Datum, Autor, Auszug und Kategorie ausblenden und sieht damit aus wie ein Projektraster statt wie ein Blogarchiv. Beinahe lautlos danebengegangen: |default(true) macht in Twig aus einem gespeicherten false ein true - die Einstellung haette sich speichern lassen und nichts getan. Der Test prueft beide Richtungen. Ein Bild darf verlinken, damit ein Logo auf die Startseite zeigt; die Adresse geht durch dieselbe Pruefung wie jeder andere Link. Und der Kopfbereich kann beim Scrollen oben bleiben - als Einstellung der Website, weil nur das umschliessende Element kleben kann. Der groesste Fund steckt im Editor: die Liste bekannter Schemafassungen endete bei 12, waehrend Bausteine v13 bis v15 verlangen. In einem aktuellen Dokument liess sich damit kein Baustein mehr einfuegen, und Symbol, Fortschritt, Slider und externer Inhalt in gar keinem. Jetzt eine Zahl an einer Stelle, mit einem Test ueber jeden Typ und jede Fassung. Geprueft: 389 PHP-Tests unter 8.2 und 8.4, 18 JS-Tests, Editortest, Browserpruefung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
4.3 KiB
Twig
66 lines
4.3 KiB
Twig
<!doctype html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>{{ heading }}{% if result.page > 1 %} · Seite {{ result.page }}{% endif %} · Beiträge</title>
|
|
<meta name="description" content="{{ term ? 'Beiträge zu ' ~ term.name : 'Alle Beiträge' }}.">
|
|
<link rel="canonical" href="{{ canonical }}">
|
|
{% if result.page > 1 %}<link rel="prev" href="{{ base }}{{ result.page > 2 ? '?seite=' ~ (result.page - 1) : '' }}">{% endif %}
|
|
{% if result.page < result.pages %}<link rel="next" href="{{ base }}?seite={{ result.page + 1 }}">{% endif %}
|
|
<link rel="alternate" type="application/rss+xml" title="Beiträge" href="/feed.xml">
|
|
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
<link rel="stylesheet" href="/assets/site.css">
|
|
<link rel="stylesheet" href="/assets/design.css">
|
|
</head>
|
|
{% set consentOpen = not editing|default(false) and consentGate.needsBanner(app.request) %}
|
|
<body class="kant{{ consentOpen ? ' consent-open' : '' }}">
|
|
<a class="skip-link" href="#main">Zum Inhalt springen</a>
|
|
{% if areas.header|default(null) %}
|
|
<header class="site-header{{ siteSettings.load().stickyHeader ? ' is-sticky' : '' }}">
|
|
{% for block in areas.header.blocks %}{% include 'blocks/block.html.twig' with {block: block, postLists: {}, forms: {}, breadcrumbs: [], navigation: navigation|default({}), sections: sections|default({}), richText: true, eagerImage: null} only %}{% endfor %}
|
|
</header>
|
|
{% endif %}
|
|
<main id="main" tabindex="-1">
|
|
<section class="block-section tone-mint width-normal">
|
|
<div class="shell section-inner">
|
|
{% if term %}<p class="post-terms-label">{{ term.kind == 'category' ? 'Kategorie' : 'Schlagwort' }}</p>{% endif %}
|
|
<h1>{{ heading }}</h1>
|
|
<p class="block-text">{{ result.total }} {{ result.total == 1 ? 'Beitrag' : 'Beiträge' }}{% if result.pages > 1 %} · Seite {{ result.page }} von {{ result.pages }}{% endif %}</p>
|
|
</div>
|
|
</section>
|
|
<section class="block-section tone-paper width-normal">
|
|
<div class="shell section-inner">
|
|
{% include 'blocks/post-list.html.twig' with {posts: result.posts} only %}
|
|
{% if result.pages > 1 %}
|
|
<nav class="pagination" aria-label="Seiten">
|
|
{% if result.page > 1 %}<a rel="prev" href="{{ base }}{{ result.page > 2 ? '?seite=' ~ (result.page - 1) : '' }}">← Neuere</a>{% endif %}
|
|
<span>Seite {{ result.page }} von {{ result.pages }}</span>
|
|
{% if result.page < result.pages %}<a rel="next" href="{{ base }}?seite={{ result.page + 1 }}">Ältere →</a>{% endif %}
|
|
</nav>
|
|
{% endif %}
|
|
</div>
|
|
</section>
|
|
</main>
|
|
{% if areas.footer|default(null) %}
|
|
<footer class="site-footer">
|
|
{% for block in areas.footer.blocks %}{% include 'blocks/block.html.twig' with {block: block, postLists: {}, forms: {}, breadcrumbs: [], navigation: navigation|default({}), sections: sections|default({}), richText: true, eagerImage: null} only %}{% endfor %}
|
|
</footer>
|
|
{% endif %}
|
|
{# Privacy statement, imprint and the way back to the consent decision. All three have to be
|
|
reachable from every page, so they are part of the template and not of the footer area,
|
|
which someone could delete. One labelled landmark, so they are not loose text either. #}
|
|
{% set legal = consentGate.legalLinks() %}
|
|
{% set revocable = not editing|default(false) and consentGate.askedGroups is not empty and not consentGate.needsBanner(app.request) %}
|
|
{% if legal is not empty or revocable %}
|
|
<nav class="legal-bar" aria-label="Rechtliches">
|
|
{% for path, label in legal %}{% if not loop.first %} · {% endif %}<a href="/{{ path }}">{{ label }}</a>{% endfor %}
|
|
{% if revocable %}{% if legal is not empty %} · {% endif %}<a href="/einwilligung">Einwilligung ändern</a>{% endif %}
|
|
</nav>
|
|
{% 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 %}
|
|
</body>
|
|
</html>
|