diff --git a/resources/views/components/web/hub/contact-modal.blade.php b/resources/views/components/web/hub/contact-modal.blade.php
new file mode 100644
index 00000000..b66c22b8
--- /dev/null
+++ b/resources/views/components/web/hub/contact-modal.blade.php
@@ -0,0 +1,99 @@
+{{--
+ Kontakt-Modal der Hub-Landing: einfaches Formular statt sichtbarer
+ E-Mail-Adresse (Spam-Schutz). Öffnet auf das Window-Event
+ `open-contact-modal` (Trigger: ``)
+ und automatisch nach Absenden (Erfolgs-Flash bzw. Validierungsfehler).
+ Versand über den host-agnostischen POST-Endpunkt des Kontaktformulars.
+--}}
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (session('contact-status'))
+
Kontakt
+
Nachricht gesendet
+
+ {{ session('contact-status') }}
+
+
+ Schließen
+
+ @else
+
Kontakt
+
Schreiben Sie uns
+
+ Ob Enterprise-Anfrage, Support oder Fragen zu Ihren Daten — wir melden uns werktags
+ schnellstmöglich zurück.
+
+
+
+ @endif
+
+
+
diff --git a/resources/views/components/web/hub/site-footer.blade.php b/resources/views/components/web/hub/site-footer.blade.php
index d9f7b1f2..839ced09 100644
--- a/resources/views/components/web/hub/site-footer.blade.php
+++ b/resources/views/components/web/hub/site-footer.blade.php
@@ -8,7 +8,6 @@
$brandTagline = $brand['tagline_short'] ?? 'Publisher · Hub';
$brandTaglineLong = $brand['tagline_long'] ?? 'Der gemeinsame Publisher-Bereich für presseecho und businessportal24.';
$footerLegal = str_replace(':year', (string) now()->year, $brand['footer_legal'] ?? '© ' . now()->year . ' pressekonto');
- $footerContactEmail = $brand['contact_email'] ?? 'info@pressekonto.com';
@endphp
@@ -39,10 +38,14 @@
diff --git a/resources/views/components/web/hub/site-header.blade.php b/resources/views/components/web/hub/site-header.blade.php
index 2e38af02..927b11d6 100644
--- a/resources/views/components/web/hub/site-header.blade.php
+++ b/resources/views/components/web/hub/site-header.blade.php
@@ -42,18 +42,29 @@
diff --git a/resources/views/components/web/hub/top-utility-bar.blade.php b/resources/views/components/web/hub/top-utility-bar.blade.php
index 84ed1940..7b7e1802 100644
--- a/resources/views/components/web/hub/top-utility-bar.blade.php
+++ b/resources/views/components/web/hub/top-utility-bar.blade.php
@@ -46,7 +46,7 @@
- Kontakt
+ Kontakt
diff --git a/resources/views/web/pressekonto.blade.php b/resources/views/web/pressekonto.blade.php
index f51e5900..2dcc5575 100644
--- a/resources/views/web/pressekonto.blade.php
+++ b/resources/views/web/pressekonto.blade.php
@@ -4,7 +4,6 @@
$brand = config('domains.domains.pressekonto.brand', []);
$from = request()->query('from');
$todayDate = now()->locale('de')->isoFormat('dddd, D. MMMM YYYY');
- $hubContactEmail = $brand['contact_email'] ?? 'info@pressekonto.com';
$fmtEuro = static fn (int $cents): string => number_format($cents / 100, $cents % 100 === 0 ? 0 : 2, ',', '.');
$fmtCount = static fn (int $value): string => number_format($value, 0, ',', '.');
$minPlanMonthlyCents = $plans->min('monthly_price_cents');
@@ -46,18 +45,29 @@
@@ -68,7 +78,7 @@
- Redaktionelle Prüfung
+ Prüfung inklusive
@@ -342,7 +352,7 @@
Prüfen lassen
- Redaktionelle Prüfung auf Quellenqualität, Relevanz und formale Korrektheit — werktags in der
+ Prüfung auf Quellenqualität, Relevanz und formale Korrektheit — werktags in der
Regel am selben Tag. Feedback direkt an der Mitteilung.
@@ -363,7 +373,7 @@
- Redaktionelle Prüfung ist Teil unseres
+ Die Prüfung ist Teil unseres
Qualitätsversprechens — keine PR-Wand, kein automatisierter Durchlauf. Das gilt für alle Tarife, auch den
Starter.
@@ -381,7 +391,7 @@
Ein Konto, beide Portale. Keine versteckten Aufschläge für Reichweite.
- Alle Tarife enthalten redaktionelle Prüfung, einen verifizierten Newsroom und die
+ Alle Tarife enthalten die Prüfung, Ihren eigenen Newsroom und die
Veröffentlichung auf und Enterprise
Mehr als 60 Mitteilungen pro Monat, mehrere Marken oder Sonderkonditionen?
- Wir erstellen Ihnen ein Angebot auf Anfrage — redaktionelle Prüfung und die
+ Wir erstellen Ihnen ein Angebot auf Anfrage — Prüfung und die
Veröffentlichung auf beiden Portalen inklusive.
-
Anfrage senden
-
+
@@ -700,8 +717,9 @@
Sie finden hier nicht, was Sie suchen?
- Schreiben Sie unserem Support — wir antworten werktags.
+ Schreiben
+ Sie unserem Support — wir antworten werktags.
@@ -722,14 +740,14 @@
Ein Konto selbst kostet nichts. Sie zahlen für die Pressemitteilungen, die Sie veröffentlichen —
entweder als Einzel-Pressemitteilung ohne Abo ({{ $fmtEuro($singlePmPriceCents) }} € netto)
oder über einen Monats- bzw. Jahres-Tarif ab {{ $fmtEuro((int) $minPlanMonthlyCents) }} € / Monat.
- Die redaktionelle Prüfung und die Veröffentlichung auf beiden Portalen sind immer enthalten.
+ Die Prüfung und die Veröffentlichung auf beiden Portalen sind immer enthalten.
Wie läuft die
- redaktionelle Prüfung?
+ Prüfung?
Datenschutzerklärung. Für
- Anfragen zu Ihren Daten erreichen Sie uns unter {{ $hubContactEmail }} .
+ Anfragen zu Ihren Daten nutzen Sie unser Kontaktformular .
@@ -885,22 +903,35 @@
+
+
@endsection
diff --git a/tests/Feature/Web/PressekontoHubHomeTest.php b/tests/Feature/Web/PressekontoHubHomeTest.php
index 5cafbd70..45fce099 100644
--- a/tests/Feature/Web/PressekontoHubHomeTest.php
+++ b/tests/Feature/Web/PressekontoHubHomeTest.php
@@ -1,6 +1,8 @@
toContain('/de/impressum')->toContain('/de/datenschutz');
});
+test('a logged-in user sees the panel link instead of the auth buttons', function () {
+ /** @var TestCase $this */
+ $this->seed(RolesAndPermissionsSeeder::class);
+ $customer = User::factory()->create(['is_active' => true, 'email_verified_at' => now()]);
+ $customer->assignRole('customer');
+
+ $this->actingAs($customer)
+ ->get('https://pressekonto.test/')
+ ->assertSuccessful()
+ ->assertSeeText('Zum pressekonto')
+ ->assertSee('/admin/me', false)
+ ->assertDontSeeText('Konto erstellen')
+ ->assertDontSeeText('Anmelden');
+});
+
+test('the hub exposes a contact modal instead of a mailto address', function () {
+ /** @var TestCase $this */
+ $response = $this->get('https://pressekonto.test/')->assertSuccessful();
+ $content = $response->getContent();
+
+ // Spam-Schutz: keine E-Mail-Adresse im Quelltext, stattdessen das Modal-Formular.
+ expect($content)
+ ->not->toContain('mailto:')
+ ->toContain('open-contact-modal')
+ ->toContain('action="'.route('kontakt.store', ['edition' => 'de']).'"')
+ ->toContain('name="website"');
+});
+
+test('the hub page speaks of Pruefung without the redaktionell qualifier', function () {
+ /** @var TestCase $this */
+ $this->get('https://pressekonto.test/')
+ ->assertSuccessful()
+ ->assertDontSeeText('Redaktionelle Prüfung')
+ ->assertDontSeeText('redaktionelle Prüfung')
+ ->assertSeeText('Prüfung inklusive');
+});
+
test('legal pages are reachable on the hub domain', function () {
/** @var TestCase $this */
$this->get('https://pressekonto.test/de/impressum')->assertSuccessful();