Arbeitsplan 14.09.2026, Punkte 1.1 bis 1.4 (Nachträge 6 bis 10 im Entwicklungsplan): - Farbwelt Interior (Tanne, Creme, Sand, Ocker, Clay) als Standard, Immobilien-Welt behält das bisherige Blau über body.world-immobilien; Logo je Welt, Favicons neu, Welten-Wechsler in Kopf- und Fußzeile. - Saubere Trennung der Welten: eigene Navigation, Ankündigungsleiste, Magazinliste, Über-uns-Seite, FAQ, Kontaktseite und Abschluss-CTA für Immobilien; Beiträge tragen eine Welt (Migration + Admin-Feld). Abschluss-CTA Ton in Ton statt Grün-zu-Ocker. - Kontakt: Betreffe in Gruppen Interior / Immobilien / B2in, Marken darin. Terminanfrage-Buttons öffnen das Widget mit vorgewähltem Anliegen; Select-Felder einheitlich gestaltet. - Tischlerei als vierte Kernmarke (Platzhalter), Kachelraster 2×2. - Herkunfts-Sektion „Aus der Region gefertigt“ mit schematischer Standortkarte und Ablauf CABINET (Beratung Bielefeld, Fertigung Köln, Aufbau mit Tischlerei). Deployment: migrate, WorldSplitCmsSeeder, CmsBrandSeeder, OriginSectionCmsSeeder (Abschnitt 8 im Entwicklungsplan). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
137 lines
8.3 KiB
PHP
137 lines
8.3 KiB
PHP
<header class="header-normal" id="header">
|
||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||
<div class="flex items-center justify-between h-16">
|
||
{{-- Logo je Welt: Interior mit Zusatz und Ocker-Bogen, Immobilien ohne Zusatz
|
||
mit blauem Bogen. Der Pfad wird in mount() festgehalten. --}}
|
||
<a href="{{ $domainUrl }}" class="flex items-center">
|
||
<img src="{{ asset($logoPath) }}"
|
||
alt="{{ $domainName ?? 'B2in Interior' }} Logo" class="h-12 w-auto" />
|
||
</a>
|
||
|
||
<nav class="hidden md:flex items-center space-x-8" aria-label="{{ __('ui.main_navigation') }}">
|
||
@if(isset($content['navigation']) && is_array($content['navigation']))
|
||
@foreach ($content['navigation'] as $navItem)
|
||
<a href="{{ $navItem['url'] }}"
|
||
class="text-sm font-medium transition-colors relative
|
||
@if ($this->isActiveRoute($navItem['url'])) text-secondary after:absolute after:bottom-[-4px] after:left-0 after:w-full after:h-0.5 after:bg-secondary after:rounded-full
|
||
@else
|
||
text-primary hover:text-secondary @endif">
|
||
{{ $navItem['label'] }}
|
||
</a>
|
||
@endforeach
|
||
@endif
|
||
</nav>
|
||
|
||
<div class="flex items-center space-x-4">
|
||
{{-- Welten-Wechsler: Interior / Immobilien. Die aktive Welt ist gefuellt,
|
||
die andere nur Text – ein Umschalter, keine zweite Navigation. --}}
|
||
<nav class="hidden md:flex items-center rounded-full border border-border p-0.5 text-xs font-medium"
|
||
aria-label="{{ __('ui.worlds_label') }}" data-world-switch>
|
||
@foreach ($worlds as $key => $world)
|
||
<a href="{{ $world['url'] }}"
|
||
class="px-3 py-1 rounded-full transition-colors duration-200 {{ $world['active'] ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground' }}"
|
||
@if ($world['active']) aria-current="page" @endif
|
||
wire:key="world-switch-{{ $key }}">
|
||
{{ $world['label'] }}
|
||
</a>
|
||
@endforeach
|
||
</nav>
|
||
|
||
{{-- Language Switcher --}}
|
||
<div class="hidden md:flex items-center space-x-1 text-sm" role="group" aria-label="Language">
|
||
@foreach ($availableLocales as $locale => $label)
|
||
<button wire:click="switchLanguage('{{ $locale }}')"
|
||
class="px-2 py-1 rounded transition-colors duration-200
|
||
{{ $currentLocale === $locale
|
||
? 'text-secondary font-semibold'
|
||
: 'text-muted-foreground hover:text-foreground' }}"
|
||
@if($currentLocale === $locale) aria-current="true" @endif>
|
||
{{ $label }}
|
||
</button>
|
||
@if (!$loop->last)
|
||
<span class="text-border">|</span>
|
||
@endif
|
||
@endforeach
|
||
</div>
|
||
|
||
{{-- Hauptton statt Akzent: Ocker (Interior) traegt keinen Text mit
|
||
ausreichendem Kontrast, Tanne bzw. Anthrazit schon. --}}
|
||
<a href="{{ $contactUrl }}"
|
||
class="hidden md:block rounded-md px-5 py-2.5 text-sm font-medium bg-primary text-primary-foreground hover-bg-primary-light transition-all duration-200">
|
||
{{ __('ui.contact') }}
|
||
</a>
|
||
<button wire:click="toggleMobileMenu"
|
||
class="md:hidden w-5 h-5 text-muted-foreground hover:text-foreground transition-colors"
|
||
aria-label="{{ $this->isMobileMenuOpen ? __('ui.menu_close') : __('ui.menu_open') }}"
|
||
aria-expanded="{{ $this->isMobileMenuOpen ? 'true' : 'false' }}">
|
||
@if ($this->isMobileMenuOpen)
|
||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||
d="M6 18L18 6M6 6l12 12"></path>
|
||
</svg>
|
||
@else
|
||
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
||
d="M4 6h16M4 12h16M4 18h16"></path>
|
||
</svg>
|
||
@endif
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
{{-- Mobile Menu --}}
|
||
@if ($this->isMobileMenuOpen)
|
||
<div class="md:hidden border-t border-border bg-background/95 backdrop-blur-sm">
|
||
<nav class="px-4 py-6 space-y-4" aria-label="{{ __('ui.mobile_navigation') }}">
|
||
<div class="flex items-center gap-2 px-3 pb-2 text-xs font-medium" role="group"
|
||
aria-label="{{ __('ui.worlds_label') }}" data-world-switch>
|
||
@foreach ($worlds as $key => $world)
|
||
<a href="{{ $world['url'] }}"
|
||
class="px-3 py-1.5 rounded-full border transition-colors duration-200 {{ $world['active'] ? 'bg-primary text-primary-foreground border-primary' : 'border-border text-muted-foreground hover:text-foreground' }}"
|
||
@if ($world['active']) aria-current="page" @endif
|
||
wire:key="world-switch-mobile-{{ $key }}">
|
||
{{ $world['label'] }}
|
||
</a>
|
||
@endforeach
|
||
</div>
|
||
|
||
@if(isset($content['navigation']) && is_array($content['navigation']))
|
||
@foreach ($content['navigation'] as $navItem)
|
||
<a href="{{ $navItem['url'] }}"
|
||
class="block text-sm font-medium transition-colors py-2 px-3 rounded-md
|
||
@if ($this->isActiveRoute($navItem['url'])) text-secondary bg-secondary/10 border-l-2 border-secondary
|
||
@else
|
||
text-foreground hover:text-secondary hover:bg-muted/50 @endif"
|
||
wire:click="closeMobileMenu">
|
||
{{ $navItem['label'] }}
|
||
</a>
|
||
@endforeach
|
||
@endif
|
||
<div class="pt-4 border-t border-border space-y-3">
|
||
{{-- Mobile Language Switcher --}}
|
||
<div class="flex items-center space-x-1 text-sm px-3" role="group" aria-label="Language">
|
||
@foreach ($availableLocales as $locale => $label)
|
||
<button wire:click="switchLanguage('{{ $locale }}')"
|
||
class="px-3 py-1.5 rounded transition-colors duration-200
|
||
{{ $currentLocale === $locale
|
||
? 'text-secondary font-semibold bg-secondary/10'
|
||
: 'text-muted-foreground hover:text-foreground' }}"
|
||
@if($currentLocale === $locale) aria-current="true" @endif>
|
||
{{ $label }}
|
||
</button>
|
||
@if (!$loop->last)
|
||
<span class="text-border">|</span>
|
||
@endif
|
||
@endforeach
|
||
</div>
|
||
|
||
<a href="{{ $contactUrl }}"
|
||
class="block rounded-md px-5 py-2.5 text-sm font-medium bg-primary text-primary-foreground hover-bg-primary-light transition-all duration-200 text-center">
|
||
{{ __('ui.contact') }}
|
||
</a>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
@endif
|
||
</div>
|
||
</header>
|