Abstimmungsrunde 03.09.: CABINET-Seite, korrigierte Markentexte, Galerie-Hinweise, Abschluss-CTA

Setzt die vier Punkte aus dev/2026-08-28/umsetzung-03-09-2026.md um.

1. Markenseiten
   - Rotpunkt und Febrü auf die korrigierten Fassungen (*_FINAL.md) gebracht:
     bei Rotpunkt sind die beiden Nachhaltigkeitsabschnitte zusammengefuehrt,
     bei Febrü behaelt der Blaue-Engel-Satz seinen Produktbezug ohne den
     erklaerenden Zusatz.
   - CABINET nach demselben Muster neu verfasst: 8 Abschnitte, 3 Vertiefungen,
     eigener Abschlussblock und eigene Widget-Beschriftung. Bewusst ohne Zahlen,
     Zertifizierungen oder Herstelleraussagen – dafuer gibt es keine Quelle.
     Braucht Marcels Freigabe.
   - Febrü-Claim korrigiert: „Arbeiten, wo man gerne bleibt.“

2. „BEISPIEL“-Vermerk aus den Bildunterschriften entfernt. Weil die Demobilder
   auf Vorschau und Live bereits in der Datenbank stehen, entfernt
   BrandGalleryCaptionNormalizerSeeder ihn dort in-place – nur der Text, Bild,
   Kategorie und Reihenfolge bleiben unberuehrt.

3. Hinweise zu Visualisierungen neu formuliert (Markengalerie und /referenzen).
   Die Trennung bleibt, sie laeuft nur nicht mehr ueber eine Verneinung.

4. Abschluss-CTA der Markenseiten ueberarbeitet: weiche Lichtflaechen statt
   Vollton, gesetzter Hauptbutton mit Pfeil, Herstellerseite als gleichwertiger
   Outline-Button, Showroom als Fusszeile.

Ein Pruefskript hat jeden veroeffentlichten Satz gegen die abgestimmten
Markdown-Fassungen gehalten: keine Abweichung.

Tests: 859 gruen (3180 Assertions), Pint sauber, npm run build:b2in gebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-03 09:17:16 +00:00
parent 4ef3a4d8f1
commit a52347845e
18 changed files with 884 additions and 63 deletions

View file

@ -27,6 +27,15 @@ it('renders the delivered sections on the rotpunkt page', function () {
->assertSee('Küchenstudio plus Handwerk', false);
});
it('renders the cabinet sections written to the same pattern', function () {
$this->get('/marken/cabinet')
->assertSuccessful()
->assertSee('Millimeter statt Standardmaß', false)
->assertSee('Aufmaß vor Ort statt Schätzung am Telefon', false)
->assertSee('Warum CABINET bei uns?')
->assertSee('Ihr Raum. Persönlich geplant.', false);
});
it('renders the delivered sections on the februe page', function () {
$this->get('/marken/februe')
->assertSuccessful()
@ -44,6 +53,21 @@ it('turns every marked deepening into a collapsible area', function () {
->and($html)->toContain('NEW DIMENSIONS');
});
it('merges the two sustainability sections as the corrected version requires', function () {
$html = $this->get('/marken/rotpunkt')->assertSuccessful()->getContent();
expect($html)->not->toContain('Greenline hält dem Vergleich stand')
->and($html)->toContain('ohne Verkaufsnebel')
// Der doppelte Satz steht nur noch einmal auf der Seite.
->and(substr_count($html, 'Nachhaltigkeit braucht keine großen Versprechen'))->toBe(1);
});
it('keeps the blauer engel claim tied to the listed product groups', function () {
$this->get('/marken/februe')
->assertSuccessful()
->assertSee('Ausgewählte Febrü-Tischsysteme und Stauraummöbel tragen den Blauen Engel.', false);
});
it('shows the pull quote from marcel on the februe page', function () {
$this->get('/marken/februe')
->assertSuccessful()
@ -81,6 +105,9 @@ it('uses the brand specific closing block instead of the generic one', function
});
it('falls back to the generic closing block for a brand without one', function () {
// Beide Sprachen leeren: bei nur geleertem Deutsch greift die Uebersetzungs-Fallbackkette.
CmsBrand::where('slug', 'cabinet')->firstOrFail()->update(['cta_title' => [], 'cta_text' => []]);
$this->get('/marken/cabinet')
->assertSuccessful()
->assertSee('Interesse an CABINET?');
@ -97,6 +124,7 @@ it('labels the widget for the brand of the page', function (string $slug, string
})->with([
'rotpunkt' => ['rotpunkt', 'Persönliche Küchenberatung vereinbaren'],
'februe' => ['februe', 'Persönliche Arbeitsplatzberatung vereinbaren'],
'cabinet' => ['cabinet', 'Persönliche Schrankplanung vereinbaren'],
]);
it('keeps the general label outside the brand pages', function () {

View file

@ -164,7 +164,7 @@ it('marks an image without a category as visualisation, never as a completed pro
->assertDontSee('Realisiertes Projekt');
});
it('spells out that inspirations are not completed projects', function () {
it('still separates inspirations from completed projects after the rewording', function () {
CmsBrand::where('slug', 'cabinet')->firstOrFail()->update([
'gallery' => [
['image' => 'entwurf.webp', 'category' => 'inspiration'],
@ -173,10 +173,12 @@ it('spells out that inspirations are not completed projects', function () {
$this->get('/marken/cabinet')
->assertSuccessful()
->assertSee('keine ausgeführten Projekte', false);
->assertSee('Entwürfe und Visualisierungen', false)
->assertSee('Visualisierung')
->assertDontSee('Realisiertes Projekt');
});
it('fills the demo galleries with both categories, all marked as examples', function () {
it('fills the demo galleries with both categories', function () {
$this->seed(\Database\Seeders\DemoBrandGallerySeeder::class);
$grouped = CmsBrand::groupGallery(CmsBrand::where('slug', 'cabinet')->firstOrFail()->gallery);
@ -184,10 +186,31 @@ it('fills the demo galleries with both categories, all marked as examples', func
expect($grouped['projects'])->not->toBeEmpty()
->and($grouped['inspirations'])->not->toBeEmpty();
// Kein Demobild darf sich unbemerkt als echte Referenz ausgeben.
// Der Vermerk „BEISPIEL“ ist auf Kundenwunsch entfallen. Die Unterscheidung muss deshalb
// an der Kategorie haengen – jedes Demobild braucht eine ausdrueckliche.
foreach (CmsBrand::all() as $brand) {
foreach ($brand->gallery ?? [] as $item) {
expect($item['caption'])->toStartWith('BEISPIEL');
expect($item['caption'])->not->toContain('BEISPIEL')
->and($item['category'])->toBeIn(CmsBrand::GALLERY_CATEGORIES);
}
}
});
it('strips the old example prefix without touching image, category or order', function () {
CmsBrand::where('slug', 'cabinet')->firstOrFail()->update([
'gallery' => [
['image' => 'a.webp', 'category' => 'project', 'caption' => 'BEISPIEL – Ankleide, Bielefeld'],
['image' => 'b.webp', 'category' => 'inspiration', 'caption' => 'Entwurf Garderobe'],
],
]);
$this->seed(\Database\Seeders\BrandGalleryCaptionNormalizerSeeder::class);
$gallery = CmsBrand::where('slug', 'cabinet')->firstOrFail()->gallery;
expect($gallery)->toHaveCount(2)
->and($gallery[0]['caption'])->toBe('Ankleide, Bielefeld')
->and($gallery[0]['image'])->toBe('a.webp')
->and($gallery[0]['category'])->toBe('project')
->and($gallery[1]['caption'])->toBe('Entwurf Garderobe');
});