13-05-2026 Frontend DEV + HUB
This commit is contained in:
parent
5b8bdf4182
commit
092ee0e918
24 changed files with 3560 additions and 34 deletions
66
resources/views/components/web/brand-mark.blade.php
Normal file
66
resources/views/components/web/brand-mark.blade.php
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
@props([
|
||||
'brand' => 'presseportale',
|
||||
'variant' => 'auto',
|
||||
'serif' => true,
|
||||
])
|
||||
|
||||
@php
|
||||
/**
|
||||
* Zentrale Brand-Wortmarke für alle drei Marken der Verlags-Familie.
|
||||
*
|
||||
* Schreibweise (verbindlich):
|
||||
* - presseecho → "presse" + "echo" (echo ist die Akzentfarbe)
|
||||
* - businessportal24 → "businessportal" + "24" (24 ist orange)
|
||||
* - presseportale → "presse" + "portale" (portale ist Bernstein)
|
||||
*
|
||||
* Keine TLD-Endung (".de", ".com") direkt am Markennamen. Diese gehören
|
||||
* – falls überhaupt – getrennt in den juristischen Bereich (Impressum, Kontakt).
|
||||
*
|
||||
* Schriftart:
|
||||
* - Standard `font-serif` (Source Serif 4) – passt zum Editorial-Charakter
|
||||
* von Presseecho und BusinessPortal24. Der Hub lädt Source Serif 4
|
||||
* ebenfalls mit, damit Markennennungen typografisch konsistent bleiben.
|
||||
* - `:serif="false"` schaltet auf font-sans (Inter Tight) – etwa für die
|
||||
* Top-Utility-Bar, in der die Marken sehr klein erscheinen.
|
||||
*
|
||||
* Variant:
|
||||
* - `auto` → Akzentfarbe = Theme-Default (Orange / Grün / Bernstein)
|
||||
* - `on-dark` → hellere/wärmere Akzentfarbe (für dunkle Hub-Panels)
|
||||
* - `mono` → Akzent identisch zum Basis-Ton (z. B. wenn beides weiß sein soll)
|
||||
*/
|
||||
$marks = [
|
||||
'presseecho' => [
|
||||
'name' => 'presse',
|
||||
'accent' => 'echo',
|
||||
'accent_color_auto' => '#345636',
|
||||
'accent_color_on_dark' => '#9BD5B2',
|
||||
],
|
||||
'businessportal24' => [
|
||||
'name' => 'businessportal',
|
||||
'accent' => '24',
|
||||
'accent_color_auto' => '#C84A1E',
|
||||
'accent_color_on_dark' => '#C84A1E',
|
||||
],
|
||||
'presseportale' => [
|
||||
'name' => 'presse',
|
||||
'accent' => 'portale',
|
||||
'accent_color_auto' => '#B07A3A',
|
||||
'accent_color_on_dark' => '#B07A3A',
|
||||
],
|
||||
];
|
||||
|
||||
$mark = $marks[$brand] ?? $marks['presseportale'];
|
||||
|
||||
$accentColor = match ($variant) {
|
||||
'on-dark' => $mark['accent_color_on_dark'],
|
||||
'mono' => 'inherit',
|
||||
default => $mark['accent_color_auto'],
|
||||
};
|
||||
|
||||
$fontClass = $serif ? 'font-serif' : 'font-sans';
|
||||
|
||||
$baseAttributes = $attributes->merge(['class' => $fontClass]);
|
||||
@endphp
|
||||
|
||||
<span {{ $baseAttributes }}>{{ $mark['name'] }}<span
|
||||
style="color: {{ $accentColor }};">{{ $mark['accent'] }}</span></span>
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
@props([
|
||||
'from' => null,
|
||||
])
|
||||
|
||||
@php
|
||||
$brandMap = [
|
||||
'presseecho' => [
|
||||
'brand' => 'presseecho',
|
||||
'url' => config('domains.domain_presseecho_url'),
|
||||
],
|
||||
'businessportal24' => [
|
||||
'brand' => 'businessportal24',
|
||||
'url' => config('domains.domain_businessportal_url'),
|
||||
],
|
||||
];
|
||||
|
||||
$context = $brandMap[$from] ?? null;
|
||||
@endphp
|
||||
|
||||
@if ($context)
|
||||
<div class="bg-hub-soft border-b border-hub-soft-2">
|
||||
<div class="max-w-layout mx-auto px-8 py-3 flex items-center gap-4">
|
||||
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-hub text-white flex-shrink-0">
|
||||
<svg width="11" height="11" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M7.5 2.5L4 6l3.5 3.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" />
|
||||
</svg>
|
||||
</span>
|
||||
<div class="text-[12.5px] text-ink-2 leading-[1.45]">
|
||||
Sie kommen von
|
||||
<a class="font-semibold underline underline-offset-[3px] decoration-hub/30 hover:decoration-hub" href="{{ $context['url'] }}">
|
||||
<x-web.brand-mark :brand="$context['brand']" />
|
||||
</a>.
|
||||
Ihr Konto hier funktioniert für <strong class="text-hub font-semibold">beide Portale</strong> —
|
||||
<x-web.brand-mark brand="presseecho" /> und <x-web.brand-mark brand="businessportal24" />.
|
||||
</div>
|
||||
<span class="flex-1"></span>
|
||||
<a href="{{ $context['url'] }}" class="inline-flex items-center gap-1.5 text-[12px] font-medium text-ink-3 hover:text-hub transition-colors">
|
||||
<svg width="10" height="10" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M7.5 2.5L4 6l3.5 3.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
|
||||
</svg>
|
||||
Zurück zu <x-web.brand-mark :brand="$context['brand']" :serif="false" class="font-medium" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
81
resources/views/components/web/hub/site-footer.blade.php
Normal file
81
resources/views/components/web/hub/site-footer.blade.php
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
@props([
|
||||
'brand' => null,
|
||||
])
|
||||
|
||||
@php
|
||||
$themeKey = config('app.theme', 'presseportale');
|
||||
$brand = $brand ?? config('domains.domains.' . $themeKey . '.brand', []);
|
||||
$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 . ' presseportale');
|
||||
@endphp
|
||||
|
||||
<footer class="bg-hub-grad-2 text-ink-on-dark">
|
||||
<div class="max-w-layout mx-auto px-8 py-14 grid gap-10" style="grid-template-columns:1.5fr 1fr 1fr 1fr;">
|
||||
|
||||
<div>
|
||||
<div class="text-[24px] font-bold leading-none tracking-[-0.5px] text-white">
|
||||
<x-web.brand-mark brand="presseportale" :serif="false" />
|
||||
</div>
|
||||
<div class="eyebrow on-dark mt-2 text-[9.5px] tracking-[0.22em]">
|
||||
{{ $brandTagline }}
|
||||
</div>
|
||||
<p class="text-[12.5px] text-white/65 leading-[1.65] mt-4 max-w-[340px]">
|
||||
{{ $brandTaglineLong }}
|
||||
</p>
|
||||
<div class="mt-5 pt-5 border-t border-white/15 text-[12px] text-white/65">
|
||||
Brand-Familie:
|
||||
<a class="font-semibold underline underline-offset-[3px] decoration-white/30 ml-1" href="{{ config('domains.domain_presseecho_url') }}">
|
||||
<x-web.brand-mark brand="presseecho" variant="on-dark" />
|
||||
</a>
|
||||
<span class="mx-2 text-white/30">·</span>
|
||||
<a class="font-semibold underline underline-offset-[3px] decoration-white/30" href="{{ config('domains.domain_businessportal_url') }}">
|
||||
<x-web.brand-mark brand="businessportal24" variant="on-dark" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="eyebrow on-dark mb-3.5">Konto</div>
|
||||
<ul class="space-y-2 text-[13px] text-white/75 list-none p-0 m-0">
|
||||
<li><a href="{{ route('login') }}" class="hover:text-white transition-colors">Anmelden</a></li>
|
||||
<li><a href="{{ route('register') }}" class="hover:text-white transition-colors">Konto erstellen</a></li>
|
||||
<li><a href="#tarife" class="hover:text-white transition-colors">Tarife</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Vertrieb kontaktieren</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Status</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="eyebrow on-dark mb-3.5">Plattform</div>
|
||||
<ul class="space-y-2 text-[13px] text-white/75 list-none p-0 m-0">
|
||||
<li><a href="#funktion" class="hover:text-white transition-colors">So funktioniert es</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Redaktionsrichtlinien</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Dokumentation</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">API-Referenz</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Changelog</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="eyebrow on-dark mb-3.5">Rechtliches</div>
|
||||
<ul class="space-y-2 text-[13px] text-white/75 list-none p-0 m-0">
|
||||
<li><a href="#" class="hover:text-white transition-colors">Impressum</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">AGB</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Datenschutz</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">DPA / AV</a></li>
|
||||
<li><a href="#" class="hover:text-white transition-colors">Cookie-Einstellungen</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border-t border-white/15">
|
||||
<div class="max-w-layout mx-auto px-8 py-5 flex items-center justify-between gap-4 text-[11.5px] text-white/55">
|
||||
<span>{{ $footerLegal }}</span>
|
||||
<span class="flex items-center gap-2 font-mono text-[10.5px]">
|
||||
<span class="inline-block w-1.5 h-1.5 rounded-full bg-ok"></span>
|
||||
Alle Systeme betriebsbereit
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
60
resources/views/components/web/hub/site-header.blade.php
Normal file
60
resources/views/components/web/hub/site-header.blade.php
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
@props([
|
||||
'navigation' => null,
|
||||
'brand' => null,
|
||||
])
|
||||
|
||||
@php
|
||||
$themeKey = config('app.theme', 'presseportale');
|
||||
$brand =
|
||||
$brand ??
|
||||
config('domains.domains.' . $themeKey . '.brand', [
|
||||
'name' => 'presse',
|
||||
'accent' => 'portale',
|
||||
'tagline_short' => 'Publisher · Hub',
|
||||
]);
|
||||
$brandTagline = $brand['tagline_short'] ?? 'Publisher · Hub';
|
||||
|
||||
$navigation = $navigation ?? [
|
||||
['label' => 'Tarife', 'href' => '#tarife'],
|
||||
['label' => 'So funktioniert es', 'href' => '#funktion'],
|
||||
['label' => 'Plattform-Familie', 'href' => '#familie'],
|
||||
['label' => 'FAQ', 'href' => '#faq'],
|
||||
['label' => 'Dokumentation', 'href' => '#'],
|
||||
];
|
||||
@endphp
|
||||
|
||||
<header class="bg-bg-elev border-b border-bg-rule">
|
||||
<div class="max-w-layout mx-auto px-8 py-[18px] grid items-center gap-6" style="grid-template-columns:auto 1fr auto;">
|
||||
|
||||
<a href="{{ route('home') }}" class="flex items-baseline gap-2.5 cursor-pointer group"
|
||||
aria-label="presseportale Startseite">
|
||||
<span class="text-[24px] font-bold tracking-[-0.5px] leading-none text-hub">
|
||||
<x-web.brand-mark brand="presseportale" :serif="false" />
|
||||
</span>
|
||||
<span class="hidden md:inline-block w-px h-[18px] bg-bg-rule"></span>
|
||||
<span class="eyebrow muted text-[9.5px] tracking-[0.22em]">{{ $brandTagline }}</span>
|
||||
</a>
|
||||
|
||||
<nav class="hidden lg:flex items-center justify-center gap-1 text-[13.5px] font-medium">
|
||||
@foreach ($navigation as $item)
|
||||
<a href="{{ $item['href'] }}"
|
||||
class="px-3.5 py-2 text-ink-2 hover:text-hub transition-colors">{{ $item['label'] }}</a>
|
||||
@endforeach
|
||||
</nav>
|
||||
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="{{ route('login') }}"
|
||||
class="inline-flex items-center gap-2 px-4 py-2.5 text-[13px] font-semibold text-ink rounded-[4px] hover:bg-bg transition-colors">
|
||||
Anmelden
|
||||
</a>
|
||||
<a href="{{ route('register') }}"
|
||||
class="inline-flex items-center gap-2 px-[18px] py-2.5 text-[13px] font-semibold text-white bg-hub hover:bg-hub-2 rounded-[4px] transition-colors">
|
||||
Konto erstellen
|
||||
<svg width="11" height="11" viewBox="0 0 12 12" fill="none">
|
||||
<path d="M3 9L9 3M9 3H4M9 3v5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
|
||||
stroke-linejoin="round" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
55
resources/views/components/web/hub/top-utility-bar.blade.php
Normal file
55
resources/views/components/web/hub/top-utility-bar.blade.php
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
@props([
|
||||
'date' => null,
|
||||
'siblingPortals' => [
|
||||
['brand' => 'presseecho', 'url' => null],
|
||||
['brand' => 'businessportal24', 'url' => null],
|
||||
],
|
||||
])
|
||||
|
||||
@php
|
||||
$displayDate = $date ?? now()->locale('de')->isoFormat('dddd, D. MMMM YYYY');
|
||||
|
||||
$defaultUrls = [
|
||||
'presseecho' => config('domains.domain_presseecho_url'),
|
||||
'businessportal24' => config('domains.domain_businessportal_url'),
|
||||
];
|
||||
@endphp
|
||||
|
||||
<div class="bg-hub-grad text-ink-on-dark-2 border-b border-black/40">
|
||||
<div class="max-w-layout mx-auto px-8 flex items-stretch text-[11.5px] tracking-wide">
|
||||
|
||||
<span class="flex items-center pr-4 py-2.5 whitespace-nowrap border-r border-white/10">
|
||||
{{ $displayDate }}
|
||||
</span>
|
||||
|
||||
<span class="flex items-center gap-2.5 px-4 py-2.5 whitespace-nowrap text-white/70">
|
||||
<svg width="13" height="13" viewBox="0 0 16 16" fill="none" class="opacity-65">
|
||||
<rect x="2" y="2" width="5.5" height="5.5" stroke="currentColor" stroke-width="1.2" />
|
||||
<rect x="8.5" y="2" width="5.5" height="5.5" stroke="currentColor" stroke-width="1.2" />
|
||||
<rect x="2" y="8.5" width="12" height="5.5" stroke="currentColor" stroke-width="1.2" />
|
||||
</svg>
|
||||
<span>Publisher-Hub für</span>
|
||||
@foreach ($siblingPortals as $index => $portal)
|
||||
@php
|
||||
$brandKey = $portal['brand'] ?? 'presseecho';
|
||||
$portalUrl = $portal['url'] ?? ($defaultUrls[$brandKey] ?? '#');
|
||||
@endphp
|
||||
<a href="{{ $portalUrl }}" class="text-white font-semibold hover:underline">
|
||||
<x-web.brand-mark :brand="$brandKey" variant="on-dark" :serif="false" />
|
||||
</a>
|
||||
@if (! $loop->last)
|
||||
<span class="text-white/30">·</span>
|
||||
@endif
|
||||
@endforeach
|
||||
</span>
|
||||
|
||||
<span class="flex-1"></span>
|
||||
|
||||
<span class="flex items-center gap-4 py-2.5 whitespace-nowrap text-white/65">
|
||||
<a href="#" class="hover:text-white">Status</a>
|
||||
<a href="#" class="hover:text-white">Dokumentation</a>
|
||||
<a href="#" class="hover:text-white">Kontakt</a>
|
||||
</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
'accent' => '24',
|
||||
'tagline_short' => 'Pressemitteilungen · DACH',
|
||||
'tagline_long' => 'Veröffentlichungs-Portal für redaktionell geprüfte Pressemitteilungen aus Deutschland, Österreich und der Schweiz.',
|
||||
'footer_legal' => '© :year businessportal24.com · Alle Rechte vorbehalten',
|
||||
'footer_legal' => '© :year businessportal24 · Alle Rechte vorbehalten',
|
||||
'about_label' => 'Über businessportal24',
|
||||
]);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue