Interior-Feinschliff: Hero-Slideshow, Lektorat, Rechtstexte, Aufräumen und Korrekturen 08.10.

Startseite und Heroes
- Hero-Slideshow (11 Motive inkl. Febrü) mit Infokarte, Laufzeit-Linie, größeren Klickflächen,
  Goldrahmen und mobiler Karte unter dem Bild; Zeile über der Überschrift, neue Vertrauenspunkte
- Hero-Stil auf Marken, Über uns und Kontakt übertragen, Breadcrumb entfernt
- Gründer-Leiste, Vision-Box auf Ocker, Showroom-Display in Box mit „Größer ansehen“/Vollbild
- Akzentfarbe #a8741f, größere Serif-Überschriften in der Interior-Welt
- Marken: Bildpause mit Zitat; Vereine aktualisiert und verlinkt

Inhalte
- Lektorat aller angezeigten Texte, /about-Korrekturen, Rechtstexte (DDG, TDDDG, Hosting Hetzner)
- Ablauf Maßanfertigung überall einheitlich, Magazin-Beitrag neu, alte Beiträge offline,
  deutsches Datum/Lesezeit, FAQ Projektausstattung, Otterpohl
- Referenzen-Seite per CMS-Schalter ausblendbar

CMS und Technik
- Tote Sektionen, Felder, Seiten und Komponenten entfernt und archiviert (dev/2026-08-28/archiv-*)
- Entwurf /entwurf, Farb-Schalter und /welcome entfernt; Test-Routen nur noch lokal
- Seitenbaum-Beschreibungen geprüft, fehlende CMS-Felder ergänzt, Markenliste aus „Kernmarken“
- Admin-Bildvorschauen repariert, verwendete Bilder in die Mediathek übernommen
- Seeder für das Deployment siehe dev/2026-08-28/entwicklungsplan.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-10-08 14:00:15 +00:00
parent 4b07bbdcae
commit fcb10be120
406 changed files with 22549 additions and 3798 deletions

View file

@ -0,0 +1,89 @@
<?php
namespace Database\Seeders;
use FluxCms\Core\Models\CmsContent;
use FluxCms\Core\Services\CmsContentService;
use Illuminate\Database\Seeder;
/**
* Slideshow im Hero der Startseite (Abstimmung 07.10.2026).
*
* Trägt die neun Bilder aus dev/2026-08-28/images/slideshow (als WebP unter
* public/img/assets/b2in/slideshow/) samt Wechselintervall in den CMS-Eintrag home/hero ein –
* je Sprache aus resources/lang/{de,en}/b2in.php. Steht dort schon eine Liste `slides`, bleibt sie,
* wie sie gepflegt ist – nur fehlende Texte für die Infokarte (`caption`) kommen bei den gelieferten
* Bildern dazu. Mehrfaches Ausführen ist unbedenklich.
*
* php artisan db:seed --class=HomeHeroSlidesSeeder
*/
class HomeHeroSlidesSeeder extends Seeder
{
public function run(): void
{
$row = CmsContent::query()->where('group', 'home')->where('key', 'hero')->first();
if (! $row) {
$this->command?->info('Hero-Slideshow: home/hero nicht im CMS – die Lang-Datei gilt.');
return;
}
$value = $row->getTranslations('value');
$changed = false;
foreach ($value as $locale => $content) {
$defaults = trans('b2in.themes.b2in.hero', [], $locale);
if (! is_array($content) || ! is_array($defaults) || ! is_array($defaults['slides'] ?? null)) {
continue;
}
if (! array_key_exists('slides', $content)) {
$value[$locale] = $content + ['interval' => $defaults['interval'] ?? 7, 'slides' => $defaults['slides']];
$changed = true;
continue;
}
$withCaptions = $this->addMissingCaptions((array) $content['slides'], $defaults['slides']);
if ($withCaptions !== $content['slides']) {
$value[$locale]['slides'] = $withCaptions;
$changed = true;
}
}
if (! $changed) {
$this->command?->info('Hero-Slideshow: Slides bereits gepflegt, nichts geändert.');
return;
}
$row->value = $value;
$row->save();
app(CmsContentService::class)->clearCache('home');
$this->command?->info('Hero-Slideshow: Bilder bzw. Texte der Infokarte eingetragen.');
}
/**
* Ergänzt `caption` bei Slides, die eines der gelieferten Bilder zeigen und noch keinen Text haben.
*
* @param array<int, mixed> $slides
* @param array<int, array<string, mixed>> $defaults
* @return array<int, mixed>
*/
private function addMissingCaptions(array $slides, array $defaults): array
{
$captions = array_column($defaults, 'caption', 'image');
return array_map(function ($slide) use ($captions) {
if (! is_array($slide) || array_key_exists('caption', $slide) || ! isset($captions[$slide['image'] ?? ''])) {
return $slide;
}
return $slide + ['caption' => $captions[$slide['image']]];
}, $slides);
}
}