web: Transparenzseiten — was kostet, ohne Abo, loeschen/aendern (Roadmap 2.4)

Drei Seiten mit unterschiedlicher Suchintention, DE/EN, Hub + Spokes:
- /was-kostet-eine-pressemitteilung: kurze Antwort im ersten Bildschirm,
  vier Abrechnungsmodelle ohne Anbieternamen und fremde Preise, sechs
  Prueffragen fuer Folgekosten, "Was bei uns gilt" (sieben Zusagen mit
  Einloesung), Rechenbeispiel Einzelabrechnung gegen Starter-Monate mit
  Zeilen fuer beide Seiten.
- /pressemitteilung-veroeffentlichen-ohne-abo: Ablauf, enthalten / nicht
  enthalten, nichts verfaellt, wann sich ein Tarif lohnt.
- /pressemitteilung-loeschen-oder-aendern-lassen: fuenf Wege als
  Tabelle (Korrektur, Aenderung, DSGVO, Depublikation, DSA), Antragsweg
  ueber /melden/pm, Korrektur statt Loeschung, Absatz fuer Meldungen auf
  fremden Portalen ohne Zusagen ueber Dritte.

PricingTransparencyData liefert alle Zahlen aus config/billing, credits,
legal und dem Starter-Tarif; TransparencyPageController leitet die Marke
aus dem Host ab. Tabellen-Typografie fuer .pm-body. Verlinkt aus
Preisuebersicht, Hilfe-Center, Sitemaps und llms.txt.

Test TransparencyPagesTest (9) erzwingt u. a., dass im Rechenbeispiel
beide Modelle Zeilen gewinnen. Protokoll Teil 5, Roadmap 2.4 abgehakt.

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

View file

@ -0,0 +1,64 @@
@extends('web.layouts.web-master')
@php
// Roadmap 2.4, Transparenzseite 2: Einzelveröffentlichung — was enthalten
// ist, was nicht (ehrlich), wann ein Tarif trotzdem lohnt.
$publisherUrl = rtrim((string) config('domains.domain_portal_url', config('app.url')), '/');
$params = [
'net' => $singleNet,
'starter' => $starterName,
'starter_price' => $starterMonthlyNet,
'quota' => $starterQuota,
'cost_url' => route('was-kostet-eine-pressemitteilung'),
];
@endphp
@section('title', __('static.no_subscription.meta_title', ['brand' => $brandLabel]))
@section('meta_description', __('static.no_subscription.meta_description', ['price' => $singleNet]))
@section('content')
<x-web.static-page
:eyebrow="__('static.no_subscription.eyebrow')"
:title="__('static.no_subscription.title')"
:lead="__('static.no_subscription.lead')"
:breadcrumb="__('static.no_subscription.breadcrumb')"
>
<div class="pm-body max-w-[760px]">
<h2 id="ablauf">{{ __('static.no_subscription.how_heading') }}</h2>
<ol>
@foreach ([1, 2, 3, 4] as $step)
<li>{{ __('static.no_subscription.step_'.$step, $params) }}</li>
@endforeach
</ol>
<h2 id="enthalten">{{ __('static.no_subscription.included_heading') }}</h2>
<ul>
@foreach ([1, 2, 3, 4, 5, 6] as $item)
<li>{{ __('static.no_subscription.included_'.$item) }}</li>
@endforeach
</ul>
<h2 id="nicht-enthalten">{{ __('static.no_subscription.excluded_heading') }}</h2>
<ul>
@foreach ([1, 2, 3] as $item)
<li>{{ __('static.no_subscription.excluded_'.$item) }}</li>
@endforeach
</ul>
<h2 id="verfall">{{ __('static.no_subscription.no_expiry_heading') }}</h2>
<p>{{ __('static.no_subscription.no_expiry_p') }}</p>
<h2 id="tarif">{{ __('static.no_subscription.plan_heading') }}</h2>
<p>{!! __('static.no_subscription.plan_p', $params) !!}</p>
<div class="mt-10 p-6 sm:p-8 bg-ink text-white">
<h2 class="font-serif text-[22px] font-semibold m-0 mb-2 text-white">{{ __('static.no_subscription.cta_heading') }}</h2>
<p class="text-[14px] leading-[1.55] m-0 mb-5 text-white/80">{{ __('static.no_subscription.cta_text') }}</p>
<div class="flex flex-wrap gap-3">
<a href="{{ $publisherUrl }}/register" class="inline-flex items-center justify-center px-[18px] py-3 text-[14px] font-semibold bg-brand text-white hover:bg-brand-deep transition-colors no-underline">{{ __('static.no_subscription.cta_button') }} →</a>
<a href="{{ route('preise') }}" class="inline-flex items-center justify-center px-[18px] py-3 text-[14px] font-semibold text-white border border-white/30 hover:bg-white/10 transition-colors no-underline">{{ __('static.no_subscription.cta_pricing') }}</a>
</div>
</div>
</div>
</x-web.static-page>
@endsection