Oeffentliche Strecke durchgaengig auf das Editorial-Design umgestellt und
datengetrieben gemacht:
- Newsrooms-Verzeichnis + Newsroom-Detailseiten (Suche, Pagination)
- Preise-Seite neu (Abos via Plan, Einzel-PM via config/billing, Add-ons via
config/credits); Texte ausgelagert nach lang/{de,en}/pricing.php
- Pricing-Teaser-Komponente auf den Startseiten + Preise-Link in Header/Footer
- Statische Seiten im Editorial-Design ueber neue Komponente x-web.static-page:
impressum, datenschutz, agb, cookies, faq (Akkordeon), hilfe, kontakt,
ueber-uns, api (altes Theme/gradient-hero entfernt)
- Header/Footer-Linkpflege: tote #-Anker raus, FAQ/Hilfe/Cookies verlinkt,
"Anmelden" fuehrt in den Hub
- Legacy-URL-Redirects (.html, presskit->newsroom, Regionen)
- Datums-Bugfix in Feed-Komponenten
Tests: NewsroomPage, PreisePage, PricingTeaser, StaticPages, NavigationLinks,
LegacyRedirect. Doku in docs/frontend aktualisiert.
Co-authored-by: Cursor <cursoragent@cursor.com>
184 lines
12 KiB
PHP
184 lines
12 KiB
PHP
@extends('web.layouts.web-master')
|
||
|
||
@php
|
||
use Illuminate\Support\Carbon;
|
||
|
||
\Carbon\Carbon::setLocale(app()->getLocale());
|
||
|
||
$brandConfig = config('domains.domains.'.config('app.theme').'.brand', []);
|
||
$brandName = $brandConfig['name'] ?? 'businessportal';
|
||
$brandAccent = $brandConfig['accent'] ?? '24';
|
||
|
||
$palette = ['#0098A6', '#21A038', '#0018A8', '#1E1E1E', '#E20074', '#003781', '#C84A1E', '#5A6E2F'];
|
||
$fmt = fn ($value) => number_format((int) $value, 0, ',', '.');
|
||
@endphp
|
||
|
||
@section('title', 'Newsrooms – '.$brandName.$brandAccent)
|
||
@section('meta_description', 'Alle aktiven Unternehmens-Newsrooms im Überblick – redaktionell geprüfte Pressemitteilungen je Unternehmen, gebündelt und dauerhaft auffindbar im DACH-Raum.')
|
||
|
||
@section('hreflang')
|
||
<link rel="alternate" hreflang="de" href="{{ url('/de/newsrooms') }}">
|
||
<link rel="alternate" hreflang="en" href="{{ url('/en/newsrooms') }}">
|
||
<link rel="alternate" hreflang="x-default" href="{{ url('/de/newsrooms') }}">
|
||
@endsection
|
||
|
||
@section('content')
|
||
<x-web.site-header />
|
||
|
||
<main class="bg-bg text-ink">
|
||
{{-- Breadcrumb --}}
|
||
<div class="border-b border-bg-rule">
|
||
<div class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 py-2.5 flex items-center gap-2 text-[11.5px] text-ink-3">
|
||
<a href="{{ route('web.home') }}" class="hover:text-ink transition-colors">{{ $brandName }}{{ $brandAccent }}</a>
|
||
<span class="text-ink-4" aria-hidden="true">›</span>
|
||
<span class="text-ink font-semibold">Newsrooms</span>
|
||
</div>
|
||
</div>
|
||
|
||
{{-- Masthead --}}
|
||
<section class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 pt-8 lg:pt-10">
|
||
<div class="max-w-[680px]">
|
||
<div class="eyebrow mb-3">Unternehmens-Newsrooms</div>
|
||
<h1 class="font-serif text-[36px] sm:text-[46px] lg:text-[50px] font-semibold m-0 mb-4 leading-[1.05] tracking-[-1px] text-ink text-balance">
|
||
Newsrooms
|
||
</h1>
|
||
<p class="font-serif text-[16px] leading-[1.55] m-0 text-ink-2">
|
||
Alle aktiven Unternehmen mit ihren redaktionell geprüften Pressemitteilungen – gebündelt an einem Ort.
|
||
</p>
|
||
</div>
|
||
|
||
{{-- Stat strip --}}
|
||
<div class="grid grid-cols-2 lg:grid-cols-3 border-y border-bg-rule mt-8">
|
||
<div class="px-6 py-5 border-r border-bg-rule">
|
||
<div class="eyebrow muted text-[10px] mb-2.5">Aktive Newsrooms</div>
|
||
<div class="font-serif text-[32px] sm:text-[36px] font-semibold leading-none tracking-[-0.6px] text-ink">{{ $fmt($totalNewsrooms) }}</div>
|
||
<div class="text-[11.5px] text-ink-3 mt-2">mit veröffentlichten Meldungen</div>
|
||
</div>
|
||
<div class="px-6 py-5 lg:border-r border-bg-rule">
|
||
<div class="eyebrow muted text-[10px] mb-2.5">Aktiv (30 Tage)</div>
|
||
<div class="font-serif text-[32px] sm:text-[36px] font-semibold leading-none tracking-[-0.6px] text-ink">{{ $fmt($activeNewsroomsCount) }}</div>
|
||
<div class="text-[11.5px] text-ink-3 mt-2">Stand {{ $referenceNow->translatedFormat('j. M Y') }}</div>
|
||
</div>
|
||
<div class="px-6 py-5 border-t lg:border-t-0">
|
||
<div class="eyebrow muted text-[10px] mb-2.5">Meldungen im Archiv</div>
|
||
<div class="font-serif text-[32px] sm:text-[36px] font-semibold leading-none tracking-[-0.6px] text-ink">{{ $fmt($archiveTotal) }}</div>
|
||
<div class="text-[11.5px] text-ink-3 mt-2">redaktionell geprüft</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
{{-- Suche + Verzeichnis --}}
|
||
<section class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 mt-8 mb-16">
|
||
<form action="{{ route('newsrooms') }}" method="get" class="mb-7 max-w-[520px]">
|
||
<label class="sr-only" for="newsroom-search">Newsroom suchen</label>
|
||
<div class="flex items-center gap-3 px-4 py-3 border border-bg-rule-strong bg-bg-elev focus-within:border-brand transition-colors">
|
||
<svg width="18" height="18" viewBox="0 0 16 16" fill="none" class="flex-shrink-0 text-ink-3" aria-hidden="true">
|
||
<circle cx="7" cy="7" r="5" stroke="currentColor" stroke-width="1.5" />
|
||
<path d="M11 11l3 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
|
||
</svg>
|
||
<input id="newsroom-search" type="search" name="q" value="{{ $term }}"
|
||
placeholder="Unternehmen suchen…"
|
||
autocomplete="off"
|
||
class="flex-1 bg-transparent border-0 p-0 text-[14px] text-ink placeholder:text-ink-3 focus:outline-none focus:ring-0 min-w-0">
|
||
<button type="submit" class="flex-shrink-0 px-3.5 py-1.5 text-[12.5px] font-semibold bg-brand text-white rounded-[2px] hover:bg-brand-deep transition-colors">
|
||
Suchen
|
||
</button>
|
||
</div>
|
||
</form>
|
||
|
||
<header class="flex items-baseline justify-between mb-1 flex-wrap gap-3">
|
||
<h2 class="font-serif text-[22px] font-semibold m-0 tracking-[-0.3px] text-ink">
|
||
{{ $fmt($newsrooms->total()) }}
|
||
{{ $newsrooms->total() === 1 ? 'Newsroom' : 'Newsrooms' }}
|
||
@if ($term !== '')
|
||
<span class="text-ink-3 font-normal">für „{{ $term }}"</span>
|
||
@endif
|
||
</h2>
|
||
@if ($term !== '')
|
||
<a href="{{ route('newsrooms') }}" class="text-[12.5px] text-brand font-semibold hover:text-brand-deep transition-colors">Filter zurücksetzen</a>
|
||
@endif
|
||
</header>
|
||
<hr class="rule-strong mb-6">
|
||
|
||
@if ($newsrooms->isNotEmpty())
|
||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-px bg-bg-rule border border-bg-rule">
|
||
@foreach ($newsrooms as $company)
|
||
@php
|
||
$logoUrl = $company->logoUrl();
|
||
$initial = mb_strtoupper(mb_substr((string) $company->name, 0, 1));
|
||
$color = $palette[$loop->index % count($palette)];
|
||
$latest = $company->latest_published_at ? Carbon::parse($company->latest_published_at) : null;
|
||
$isRecentlyActive = (int) ($company->recent_count ?? 0) > 0;
|
||
@endphp
|
||
<a href="{{ route('newsroom', ['slug' => $company->slug]) }}"
|
||
class="group flex flex-col bg-bg p-5 hover:bg-bg-elev transition-colors">
|
||
<div class="flex items-start gap-3.5 mb-3.5">
|
||
@if ($logoUrl)
|
||
<img src="{{ $logoUrl }}" alt="{{ $company->name }}" class="w-12 h-12 object-contain bg-white border border-bg-rule flex-shrink-0" loading="lazy">
|
||
@else
|
||
<div class="w-12 h-12 flex items-center justify-center text-white text-[18px] font-bold font-serif flex-shrink-0" style="background: {{ $color }};">
|
||
{{ $initial }}
|
||
</div>
|
||
@endif
|
||
<div class="min-w-0 flex-1">
|
||
<h3 class="font-serif text-[16px] font-semibold leading-[1.25] text-ink group-hover:text-brand transition-colors truncate">{{ $company->name }}</h3>
|
||
@if ($latest)
|
||
<div class="text-[11px] text-ink-3 mt-1">Letzte Meldung {{ $latest->translatedFormat('j. M Y') }}</div>
|
||
@endif
|
||
</div>
|
||
</div>
|
||
<div class="mt-auto flex items-center justify-between pt-3 border-t border-bg-rule">
|
||
<span class="text-[12px] text-ink-2">
|
||
<span class="font-mono font-semibold text-ink">{{ $fmt($company->releases_count ?? 0) }}</span> Meldungen
|
||
</span>
|
||
@if ($isRecentlyActive)
|
||
<span class="inline-flex items-center gap-1.5 text-[10.5px] font-semibold text-ink-2 px-2 py-0.5 bg-brand/[0.06] border border-brand/20 rounded-[2px]">
|
||
<span class="w-1.5 h-1.5 rounded-full bg-brand"></span>
|
||
{{ $fmt($company->recent_count) }} / 30 Tage
|
||
</span>
|
||
@endif
|
||
</div>
|
||
</a>
|
||
@endforeach
|
||
</div>
|
||
|
||
<x-web.pagination :paginator="$newsrooms" />
|
||
@else
|
||
<div class="border border-bg-rule bg-bg-elev px-6 py-12 text-center">
|
||
<h3 class="font-serif text-[20px] font-semibold text-ink m-0 mb-2">Keine Newsrooms gefunden</h3>
|
||
<p class="text-[13px] text-ink-3 m-0 mb-5 max-w-md mx-auto">
|
||
@if ($term !== '')
|
||
Für „{{ $term }}" gibt es derzeit keinen passenden Newsroom. Versuchen Sie einen anderen Suchbegriff.
|
||
@else
|
||
Aktuell sind keine aktiven Newsrooms verfügbar.
|
||
@endif
|
||
</p>
|
||
@if ($term !== '')
|
||
<a href="{{ route('newsrooms') }}" class="inline-flex items-center gap-2 px-4 py-2.5 text-[13px] font-semibold border border-bg-rule-strong bg-white text-ink hover:bg-bg-elev transition-colors">
|
||
Alle Newsrooms anzeigen
|
||
</a>
|
||
@endif
|
||
</div>
|
||
@endif
|
||
</section>
|
||
|
||
{{-- Publisher CTA (breit) --}}
|
||
<section class="max-w-layout mx-auto px-4 sm:px-6 lg:px-8 mb-16">
|
||
<div class="bg-topbar-grad text-ink-on-dark p-6 sm:p-9">
|
||
<div class="grid gap-9 lg:grid-cols-[1.4fr_1fr] lg:items-center">
|
||
<div>
|
||
<div class="eyebrow on-dark mb-2.5">Eigener Newsroom</div>
|
||
<h3 class="font-serif text-[24px] sm:text-[28px] font-semibold m-0 mb-2.5 leading-[1.15] text-white tracking-[-0.3px]">Bündeln Sie Ihre Pressemitteilungen im eigenen Newsroom.</h3>
|
||
<p class="text-[14px] leading-[1.55] m-0 max-w-[540px] text-white/80">Eigene Marken-URL · alle Meldungen zentral · SEO-Vorteil für Ihr Unternehmen · redaktionell geprüft.</p>
|
||
</div>
|
||
<div class="flex flex-col gap-2.5">
|
||
<a href="{{ route('veroeffentlichen') }}" class="w-full inline-flex items-center justify-center px-[18px] py-3.5 text-[14px] font-semibold bg-brand text-white hover:bg-brand-deep transition-colors">Pressemitteilung einreichen →</a>
|
||
<a href="{{ route('preise') }}" class="w-full 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">Tarife & Pakete ansehen</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
|
||
<x-web.site-footer />
|
||
@endsection
|