presseportale/resources/views/web/newsrooms.blade.php
Kevin Adametz bfad13af7d Spoke-Frontend-Audit: Fake-Inhalte raus, Newsletter-Rueckbau, echte Boersendaten, EN-Lokalisierung
Frontend-Umbau (Kevin, 06.07.2026), Ergebnis des businessportal24-Audits:

- Fake-Anzeigen und Mock-/Fallback-Daten entfernt (focus-ad, feed-ad,
  highlight-card, press-release-card, featured-releases, press-releases-grid);
  Sektionen rendern nur noch mit echten Daten oder gar nicht
- Newsletter-Strip und Newsletter-Box zurueckgebaut (Feature nachgelagert,
  vor Reaktivierung DOI-Flow noetig)
- Echte Boersendaten: MarketDataService (Yahoo-Finance-Quotes, config/market.php,
  Cache) + market:refresh alle 15 Min. im Scheduler; live-ticker blendet sich
  ohne Daten aus
- EN-Lokalisierung der Kern-Seiten via lang/de/web.php + lang/en/web.php;
  Carbon-Locale folgt app()->getLocale()
- Web-Tests auf den neuen Frontend-Stand nachgezogen (Suite: 993 gruen)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 13:36:23 +00:00

184 lines
12 KiB
PHP
Raw 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', __('web.newsrooms_page.meta_title', ['brand' => $brandName.$brandAccent]))
@section('meta_description', __('web.newsrooms_page.meta_description'))
@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">{{ __('web.newsrooms_page.eyebrow') }}</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">
{{ __('web.newsrooms_page.intro') }}
</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">{{ __('web.newsrooms.title') }}</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">{{ __('web.newsrooms_page.stat_total_sub') }}</div>
</div>
<div class="px-6 py-5 lg:border-r border-bg-rule">
<div class="eyebrow muted text-[10px] mb-2.5">{{ __('web.newsrooms_page.stat_active') }}</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">{{ __('web.spotlight.stat_window_sub', ['date' => $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">{{ __('web.newsrooms_page.stat_archive') }}</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">{{ __('web.newsrooms_page.stat_archive_sub') }}</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">{{ __('web.newsrooms_page.search_label') }}</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="{{ __('web.newsrooms_page.search_placeholder') }}"
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">
{{ __('web.header.search_submit') }}
</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">{{ __('web.search.for_term', ['term' => $term]) }}</span>
@endif
</h2>
@if ($term !== '')
<a href="{{ route('newsrooms') }}" class="text-[12.5px] text-brand font-semibold hover:text-brand-deep transition-colors">{{ __('web.newsrooms_page.reset_filter') }}</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">{{ __('web.newsrooms_page.latest_release', ['date' => $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> {{ __('web.industry_index.releases') }}
</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) }} / {{ __('web.newsrooms_page.days_30') }}
</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">{{ __('web.newsrooms_page.none_found') }}</h3>
<p class="text-[13px] text-ink-3 m-0 mb-5 max-w-md mx-auto">
@if ($term !== '')
{{ __('web.newsrooms_page.none_found_term', ['term' => $term]) }}
@else
{{ __('web.newsrooms_page.none_available') }}
@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">
{{ __('web.newsrooms.all') }}
</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">{{ __('web.newsrooms_page.cta_eyebrow') }}</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]">{{ __('web.newsrooms_page.cta_title') }}</h3>
<p class="text-[14px] leading-[1.55] m-0 max-w-[540px] text-white/80">{{ __('web.newsrooms_page.cta_text') }}</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">{{ __('web.category.cta_submit') }} →</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">{{ __('web.publisher_cta.pricing') }}</a>
</div>
</div>
</div>
</section>
</main>
<x-web.site-footer />
@endsection