presseportale/resources/views/web/newsrooms.blade.php
Kevin Adametz 028b059975
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
Editorial-Frontend: oeffentliche Unterseiten, Preise & Linkpflege
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>
2026-06-17 16:08:46 +00:00

184 lines
12 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@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 &amp; Pakete ansehen</a>
</div>
</div>
</div>
</section>
</main>
<x-web.site-footer />
@endsection