web: Unter-Navigation Preise/Transparenz auf allen vier Seiten mit aktivem Punkt

"Tarife & Preise" als erster Punkt; x-web.static-page bekommt einen Slot
`aboveTitle`, die drei Transparenzseiten tragen dieselbe Leiste mit
markierter aktueller Seite.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-17 12:23:42 +00:00
parent c96c8a6e45
commit 134af424ea
9 changed files with 29 additions and 6 deletions

View file

@ -105,6 +105,7 @@ return [
'vat_note' => 'Alle Preise sind Nettopreise und verstehen sich zzgl. der gesetzlichen Umsatzsteuer. Die Abrechnung erfolgt sicher über unseren Zahlungsdienstleister.',
'transparency_nav' => [
'pricing' => 'Tarife & Preise',
'label' => 'Transparenz',
'cost' => 'Was kostet eine Pressemitteilung?',
'no_subscription' => 'Ohne Abo veröffentlichen',

View file

@ -98,6 +98,7 @@ return [
'vat_note' => 'All prices are net and exclude statutory VAT. Billing is handled securely via our payment provider.',
'transparency_nav' => [
'pricing' => 'Plans & pricing',
'label' => 'Transparency',
'cost' => 'What does a press release cost?',
'no_subscription' => 'Publish without a subscription',

View file

@ -48,6 +48,10 @@
{{-- Masthead --}}
<section class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 pt-8 lg:pt-10">
{{-- Optionale Unter-Navigation über der Headline (z. B. Transparenzseiten). --}}
@isset($aboveTitle)
<div class="mb-6">{{ $aboveTitle }}</div>
@endisset
@if ($eyebrow)
<div class="eyebrow mb-3">{{ $eyebrow }}</div>
@endif

View file

@ -3,11 +3,12 @@
])
@php
// Roadmap 2.4: die drei Transparenzseiten als kleine horizontale
// Navigation — auf der Preisseite über der Headline, damit die Antworten
// auf „Was kostet das?", „Geht das ohne Abo?" und „Wie werde ich es wieder
// los?" neben den Tarifen stehen.
// Roadmap 2.4: Unter-Navigation über der Headline von Preisseite und den
// drei Transparenzseiten — damit die Antworten auf „Was kostet das?",
// „Geht das ohne Abo?" und „Wie werde ich es wieder los?" neben den
// Tarifen stehen. `current` = Routenname der aktuellen Seite.
$items = [
'preise' => __('pricing.transparency_nav.pricing'),
'was-kostet-eine-pressemitteilung' => __('pricing.transparency_nav.cost'),
'pressemitteilung-veroeffentlichen-ohne-abo' => __('pricing.transparency_nav.no_subscription'),
'pressemitteilung-loeschen-oder-aendern-lassen' => __('pricing.transparency_nav.change_delete'),

View file

@ -43,7 +43,7 @@
MASTHEAD
============================================================ --}}
<section class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 pt-8 lg:pt-10">
<x-web.transparency-nav class="mb-6" />
<x-web.transparency-nav class="mb-6" current="preise" />
<div class="eyebrow mb-3">{{ __('pricing.eyebrow') }}</div>
<h1 class="font-serif text-[36px] sm:text-[48px] lg:text-[52px] font-semibold m-0 leading-[1.02] tracking-[-1.2px] text-ink">
{{ __('pricing.headline') }}

View file

@ -23,6 +23,10 @@
:lead="__('static.change_delete.lead')"
:breadcrumb="__('static.change_delete.breadcrumb')"
>
<x-slot:aboveTitle>
<x-web.transparency-nav current="pressemitteilung-loeschen-oder-aendern-lassen" />
</x-slot:aboveTitle>
<div class="pm-body max-w-[760px]">
<h2 id="wege">{{ __('static.change_delete.ways_heading') }}</h2>
<table>

View file

@ -23,6 +23,10 @@
:lead="__('static.no_subscription.lead')"
:breadcrumb="__('static.no_subscription.breadcrumb')"
>
<x-slot:aboveTitle>
<x-web.transparency-nav current="pressemitteilung-veroeffentlichen-ohne-abo" />
</x-slot:aboveTitle>
<div class="pm-body max-w-[760px]">
<h2 id="ablauf">{{ __('static.no_subscription.how_heading') }}</h2>
<ol>

View file

@ -33,6 +33,10 @@
:lead="__('static.cost.lead')"
:breadcrumb="__('static.cost.breadcrumb')"
>
<x-slot:aboveTitle>
<x-web.transparency-nav current="was-kostet-eine-pressemitteilung" />
</x-slot:aboveTitle>
<div class="pm-body max-w-[760px]">
<h2 id="kurz">{{ __('static.cost.short_heading') }}</h2>
<p>{!! __('static.cost.short_p1', $params) !!}</p>

View file

@ -67,13 +67,17 @@ test('the change page names the five ways with their prices and points to the se
->assertSee('10 € netto')
->assertSee('35 € netto')
->assertSee('/de/melden/pm', false)
->assertSee('Die Meldung steht auf einem anderen Portal?');
->assertSee('Die Meldung steht auf einem anderen Portal?')
// Unter-Navigation: aktuelle Seite markiert, Preisseite verlinkt.
->assertSee('aria-current="page">Meldung löschen oder ändern</span>', false)
->assertSee("/de/preise\" class=", false);
});
test('the pages are linked from the pricing page, the help centre and the sitemap', function () {
/** @var TestCase $this */
$this->get('https://presseecho.test/de/preise')->assertSuccessful()
->assertSee('aria-label="Transparenz"', false)
->assertSee('aria-current="page">Tarife &amp; Preise</span>', false)
->assertSee('/de/was-kostet-eine-pressemitteilung', false)
->assertSee('/de/pressemitteilung-veroeffentlichen-ohne-abo', false)
->assertSee('/de/pressemitteilung-loeschen-oder-aendern-lassen', false);