web: Transparenz-Navigation ueber der Headline der Preisseite (Roadmap 2.4)

x-web.transparency-nav (Label + drei Chips) statt der kleinen Zeile unter
dem USt-Hinweis; Komponente kennt `current` fuer spaetere Wiederverwendung.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-17 12:12:22 +00:00
parent 106edb1384
commit c96c8a6e45
5 changed files with 47 additions and 4 deletions

View file

@ -104,7 +104,12 @@ return [
],
'vat_note' => 'Alle Preise sind Nettopreise und verstehen sich zzgl. der gesetzlichen Umsatzsteuer. Die Abrechnung erfolgt sicher über unseren Zahlungsdienstleister.',
'transparency_links' => 'Ausführlich: <a href=":cost_url">Was kostet eine Pressemitteilung?</a> · <a href=":no_sub_url">Veröffentlichen ohne Abo</a> · <a href=":change_url">Meldung löschen oder ändern lassen</a>',
'transparency_nav' => [
'label' => 'Transparenz',
'cost' => 'Was kostet eine Pressemitteilung?',
'no_subscription' => 'Ohne Abo veröffentlichen',
'change_delete' => 'Meldung löschen oder ändern',
],
// Render-Pflichten aus der Leistungsbeschreibung v0.2 (Slots, Credits,
// Partnerportale) — die AGB verweisen auf diese Seite als Preisquelle.

View file

@ -97,7 +97,12 @@ return [
],
'vat_note' => 'All prices are net and exclude statutory VAT. Billing is handled securely via our payment provider.',
'transparency_links' => 'In detail: <a href=":cost_url">What does a press release cost?</a> · <a href=":no_sub_url">Publish without a subscription</a> · <a href=":change_url">Have a release deleted or changed</a>',
'transparency_nav' => [
'label' => 'Transparency',
'cost' => 'What does a press release cost?',
'no_subscription' => 'Publish without a subscription',
'change_delete' => 'Delete or change a release',
],
// Rendering obligations from the service description (slots/credits/
// boost/partner portals) — the T&Cs refer to this page.

View file

@ -0,0 +1,30 @@
@props([
'current' => null,
])
@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.
$items = [
'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'),
];
@endphp
<nav {{ $attributes->merge(['class' => 'flex items-center gap-x-4 gap-y-2 flex-wrap']) }} aria-label="{{ __('pricing.transparency_nav.label') }}">
<span class="eyebrow muted text-[10px]">{{ __('pricing.transparency_nav.label') }}</span>
<ul class="m-0 p-0 list-none flex flex-wrap gap-1.5">
@foreach ($items as $routeName => $label)
<li>
@if ($routeName === $current)
<span class="inline-flex items-center px-3 py-1.5 text-[12.5px] font-semibold border border-brand bg-brand text-white" aria-current="page">{{ $label }}</span>
@else
<a href="{{ route($routeName) }}" class="inline-flex items-center px-3 py-1.5 text-[12.5px] font-semibold border border-bg-rule-strong bg-white text-ink hover:bg-bg-elev transition-colors">{{ $label }} →</a>
@endif
</li>
@endforeach
</ul>
</nav>

View file

@ -43,6 +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" />
<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') }}
@ -278,7 +279,6 @@
@endif
<p class="text-[11.5px] text-ink-3 m-0 mt-4 max-w-[680px]">{{ __('pricing.vat_note') }}</p>
<p class="text-[11.5px] text-ink-3 m-0 mt-2 max-w-[680px] [&_a]:underline [&_a]:underline-offset-2 [&_a:hover]:text-ink">{!! __('pricing.transparency_links', ['cost_url' => route('was-kostet-eine-pressemitteilung'), 'no_sub_url' => route('pressemitteilung-veroeffentlichen-ohne-abo'), 'change_url' => route('pressemitteilung-loeschen-oder-aendern-lassen')]) !!}</p>
{{-- Render-Pflichten der Leistungsbeschreibung (Slots/Credits/Boost/
Partnerportale) — die AGB verweisen auf diese Seite. --}}

View file

@ -73,7 +73,10 @@ test('the change page names the five ways with their prices and points to the se
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('/de/was-kostet-eine-pressemitteilung', false);
->assertSee('aria-label="Transparenz"', false)
->assertSee('/de/was-kostet-eine-pressemitteilung', false)
->assertSee('/de/pressemitteilung-veroeffentlichen-ohne-abo', false)
->assertSee('/de/pressemitteilung-loeschen-oder-aendern-lassen', false);
$this->get('https://presseecho.test/de/hilfe')->assertSuccessful()
->assertSee('/de/pressemitteilung-loeschen-oder-aendern-lassen', false)