.svg`. */ enum PressReleasePlaceholder: string { case GridBlue = '01-grid-blue'; case GridGreen = '02-grid-green'; case GridAmber = '03-grid-amber'; case LinesBlue = '04-lines-blue'; case LinesGreen = '05-lines-green'; case LinesAmber = '06-lines-amber'; case DotsBlue = '07-dots-blue'; case DotsGreen = '08-dots-green'; case DotsAmber = '09-dots-amber'; case WavesBlue = '10-waves-blue'; case WavesGreen = '11-waves-green'; case WavesAmber = '12-waves-amber'; case EditorialBlue = '13-editorial-blue'; case EditorialGreen = '14-editorial-green'; case EditorialAmber = '15-editorial-amber'; case SignalBlue = '16-signal-blue'; case SignalGreen = '17-signal-green'; case SignalAmber = '18-signal-amber'; /** * Default-Variante, wenn nichts gesetzt ist. */ public static function default(): self { return self::GridBlue; } /** * Liefert die Variante zu einem Roh-Wert oder den Default-Fallback. */ public static function fromValueOrDefault(?string $value): self { return self::tryFrom((string) $value) ?? self::default(); } /** * Deterministische Variante aus einem Seed (z. B. PM-ID/Titel), damit * dieselbe PM immer denselben Platzhalter bekommt. */ public static function fromSeed(int|string $seed): self { $cases = self::cases(); return $cases[abs(crc32((string) $seed)) % count($cases)]; } /** * Öffentlicher Asset-Pfad relativ zu `public/`. */ public function path(): string { return 'images/press-release-placeholders/'.$this->value.'.svg'; } /** * Lesbares Label für die UI (Picker-Tooltips etc.). */ public function label(): string { $pattern = match (true) { str_contains($this->value, 'grid') => 'Raster', str_contains($this->value, 'lines') => 'Linien', str_contains($this->value, 'dots') => 'Punkte', str_contains($this->value, 'waves') => 'Wellen', str_contains($this->value, 'editorial') => 'Editorial', default => 'Signal', }; $color = match (true) { str_contains($this->value, 'blue') => 'Blau', str_contains($this->value, 'green') => 'Grün', default => 'Bernstein', }; return $pattern.' · '.$color; } }