diff --git a/.projektstructure.txt b/.projektstructure.txt index 89283b6..cccebce 100755 --- a/.projektstructure.txt +++ b/.projektstructure.txt @@ -5,6 +5,8 @@ Aktueller Projektstand - Relevante Logik liegt in `src/App/Avatar/Lorelei.php`. - Der Avatar-Proxy liegt unter `public/page/api/avatar.php`. - Die visuelle Avatar-Konfiguration liegt im Dashboard-Modal unter `partials/landing/account/dashboard.php` und rendert Komponenten-Vorschauen live nach. +- Neue Grundvarianten werden im gleichen Modal als separates Auswahlraster eingeblendet und übernehmen die aktuell gewählten Lorelei-Komponenten. +- Alte statische Avatar-Presets und frühere Layer-Assets sind entfernt; aktiv ist nur noch der Lorelei-Generator. - Änderungen an Funktionen mit Cookies, LocalStorage, SessionStorage, Geolocation, Tracking oder Drittanbietern müssen immer auch in Datenschutz-/Cookie-Hinweisen und im Consent-Flow berücksichtigt werden. Ziel diff --git a/PROJECT_CONTEXT.md b/PROJECT_CONTEXT.md index 880925a..4bf5047 100644 --- a/PROJECT_CONTEXT.md +++ b/PROJECT_CONTEXT.md @@ -22,12 +22,13 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l - Standortfunktionen sind relevant für lokale Treffen und werden künftig weiter ausgebaut. - Profilbilder werden aktuell über DiceBear im Stil `lorelei` serverseitig erzeugt und lokal gecacht. - Der Avatar-Editor bietet aktuell visuelle Komponenten-Vorschauen statt reiner Text-Dropdowns. +- Frühere statische Preset-Avatar-Assets wurden entfernt; der aktuelle Stand nutzt nur noch den Generator mit Proxy/Cache. ## Navigation / Konto - Eingeloggte Nutzer sehen rechts ein Profil-Menü statt einzelner `Dashboard`-/`Logout`-Buttons. - Das Profil-Menü enthält aktuell `Profil`, `Kinder`, `Termine`, `Community`, `Einstellungen`, `Abmelden`. - Der Mitgliederbereich selbst ist als Layout mit linker Bereichsnavigation aufgebaut. -- Im Profil kann der Nutzer aktuell aus Lorelei-Varianten wählen, neue Seed-basierte Vorschläge laden und Komponenten wie Augen, Augenbrauen, Mund, Brille, Haare, Bart und Ohrringe direkt per Vorschaubild auswählen. +- Im Profil kann der Nutzer aktuell Komponenten wie Augen, Augenbrauen, Mund, Brille, Haare, Bart und Ohrringe direkt per Vorschaubild auswählen; neue Grundvarianten werden separat als Auswahlraster mit bereits angewendeten Komponenten eingeblendet. - Debug ist kein Menüpunkt und erscheint nur als Floating-Käfer für `site_admin` bei aktivem Debug-Modus. ## Community und Rechte diff --git a/README.md b/README.md index efd0c1d..4a3a023 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,8 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter mit Fokus auf lokale - standortbasierte Sortierung für die neuesten Treffen - eigener Einstellungsbereich für Standortfreigabe, Browser-Hinweise und Consent-Verwaltung - modernes Avatar-System auf Basis von DiceBear `lorelei`, serverseitig über einen lokalen Proxy mit Cache ausgeliefert -- Profilbild-Generator mit visueller Komponenten-Auswahl für Augen, Augenbrauen, Mund, Brille, Haare, Bart und Ohrringe +- Profilbild-Generator mit visueller Komponenten-Auswahl für Augen, Augenbrauen, Mund, Brille, Haare, Bart und Ohrringe sowie einer separaten Auswahl neuer Grundvarianten +- keine statischen Avatar-Preset-Dateien mehr im Repository; Vorschau und Auswahl laufen vollständig über den Lorelei-Generator - Consent-Manager für Analyse und externe Dienste - Navigation aktuell mit `Home`, `Suche`, `Community` - eingeloggte Nutzer sehen rechts ein Profil-Menü mit Direktlinks zu `Profil`, `Kinder`, `Termine`, `Community`, `Einstellungen` diff --git a/partials/landing/account/dashboard.php b/partials/landing/account/dashboard.php index a508e52..e71dce0 100755 --- a/partials/landing/account/dashboard.php +++ b/partials/landing/account/dashboard.php @@ -352,6 +352,14 @@ $sectionLinks = [ +
diff --git a/public/assets/avatars/layers/modern/beard/full.svg b/public/assets/avatars/layers/modern/beard/full.svg deleted file mode 100644 index b799da1..0000000 --- a/public/assets/avatars/layers/modern/beard/full.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/beard/mustache.svg b/public/assets/avatars/layers/modern/beard/mustache.svg deleted file mode 100644 index 535a8ae..0000000 --- a/public/assets/avatars/layers/modern/beard/mustache.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/beard/short.svg b/public/assets/avatars/layers/modern/beard/short.svg deleted file mode 100644 index 00c77f2..0000000 --- a/public/assets/avatars/layers/modern/beard/short.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/features/default.svg b/public/assets/avatars/layers/modern/features/default.svg deleted file mode 100644 index 6648a42..0000000 --- a/public/assets/avatars/layers/modern/features/default.svg +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/glasses/round.svg b/public/assets/avatars/layers/modern/glasses/round.svg deleted file mode 100644 index fc3b976..0000000 --- a/public/assets/avatars/layers/modern/glasses/round.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/glasses/square.svg b/public/assets/avatars/layers/modern/glasses/square.svg deleted file mode 100644 index 014d8a1..0000000 --- a/public/assets/avatars/layers/modern/glasses/square.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hair/curly.svg b/public/assets/avatars/layers/modern/hair/curly.svg deleted file mode 100644 index 059de85..0000000 --- a/public/assets/avatars/layers/modern/hair/curly.svg +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hair/fade.svg b/public/assets/avatars/layers/modern/hair/fade.svg deleted file mode 100644 index 2aaffa8..0000000 --- a/public/assets/avatars/layers/modern/hair/fade.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hair/parted.svg b/public/assets/avatars/layers/modern/hair/parted.svg deleted file mode 100644 index b98134d..0000000 --- a/public/assets/avatars/layers/modern/hair/parted.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hair/short.svg b/public/assets/avatars/layers/modern/hair/short.svg deleted file mode 100644 index 0f7f774..0000000 --- a/public/assets/avatars/layers/modern/hair/short.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hair/waves.svg b/public/assets/avatars/layers/modern/hair/waves.svg deleted file mode 100644 index ea2d423..0000000 --- a/public/assets/avatars/layers/modern/hair/waves.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hat/beanie.svg b/public/assets/avatars/layers/modern/hat/beanie.svg deleted file mode 100644 index d5ec582..0000000 --- a/public/assets/avatars/layers/modern/hat/beanie.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/hat/cap.svg b/public/assets/avatars/layers/modern/hat/cap.svg deleted file mode 100644 index aab2d9a..0000000 --- a/public/assets/avatars/layers/modern/hat/cap.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/head/oval.svg b/public/assets/avatars/layers/modern/head/oval.svg deleted file mode 100644 index 0d19968..0000000 --- a/public/assets/avatars/layers/modern/head/oval.svg +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/head/round.svg b/public/assets/avatars/layers/modern/head/round.svg deleted file mode 100644 index 353b967..0000000 --- a/public/assets/avatars/layers/modern/head/round.svg +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/head/square.svg b/public/assets/avatars/layers/modern/head/square.svg deleted file mode 100644 index 9bc08b5..0000000 --- a/public/assets/avatars/layers/modern/head/square.svg +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/outfit/crew.svg b/public/assets/avatars/layers/modern/outfit/crew.svg deleted file mode 100644 index fccbace..0000000 --- a/public/assets/avatars/layers/modern/outfit/crew.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/outfit/hoodie.svg b/public/assets/avatars/layers/modern/outfit/hoodie.svg deleted file mode 100644 index 8e691f8..0000000 --- a/public/assets/avatars/layers/modern/outfit/hoodie.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/outfit/polo.svg b/public/assets/avatars/layers/modern/outfit/polo.svg deleted file mode 100644 index 084f1d6..0000000 --- a/public/assets/avatars/layers/modern/outfit/polo.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/public/assets/avatars/layers/modern/outfit/tee.svg b/public/assets/avatars/layers/modern/outfit/tee.svg deleted file mode 100644 index 3918e7d..0000000 --- a/public/assets/avatars/layers/modern/outfit/tee.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/public/assets/avatars/presets/modern_001.png b/public/assets/avatars/presets/modern_001.png deleted file mode 100644 index 3b5852b..0000000 Binary files a/public/assets/avatars/presets/modern_001.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_002.png b/public/assets/avatars/presets/modern_002.png deleted file mode 100644 index bd4d0a1..0000000 Binary files a/public/assets/avatars/presets/modern_002.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_003.png b/public/assets/avatars/presets/modern_003.png deleted file mode 100644 index edd126f..0000000 Binary files a/public/assets/avatars/presets/modern_003.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_004.png b/public/assets/avatars/presets/modern_004.png deleted file mode 100644 index cd8d704..0000000 Binary files a/public/assets/avatars/presets/modern_004.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_005.png b/public/assets/avatars/presets/modern_005.png deleted file mode 100644 index 4ca8bcd..0000000 Binary files a/public/assets/avatars/presets/modern_005.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_006.png b/public/assets/avatars/presets/modern_006.png deleted file mode 100644 index 8ecd4f6..0000000 Binary files a/public/assets/avatars/presets/modern_006.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_007.png b/public/assets/avatars/presets/modern_007.png deleted file mode 100644 index 9d3da9e..0000000 Binary files a/public/assets/avatars/presets/modern_007.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_008.png b/public/assets/avatars/presets/modern_008.png deleted file mode 100644 index 256c279..0000000 Binary files a/public/assets/avatars/presets/modern_008.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_009.png b/public/assets/avatars/presets/modern_009.png deleted file mode 100644 index 98b76ad..0000000 Binary files a/public/assets/avatars/presets/modern_009.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_010.png b/public/assets/avatars/presets/modern_010.png deleted file mode 100644 index c20f42f..0000000 Binary files a/public/assets/avatars/presets/modern_010.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_011.png b/public/assets/avatars/presets/modern_011.png deleted file mode 100644 index d015725..0000000 Binary files a/public/assets/avatars/presets/modern_011.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_012.png b/public/assets/avatars/presets/modern_012.png deleted file mode 100644 index 6e1c296..0000000 Binary files a/public/assets/avatars/presets/modern_012.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_013.png b/public/assets/avatars/presets/modern_013.png deleted file mode 100644 index 921c86b..0000000 Binary files a/public/assets/avatars/presets/modern_013.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_014.png b/public/assets/avatars/presets/modern_014.png deleted file mode 100644 index 156a4c0..0000000 Binary files a/public/assets/avatars/presets/modern_014.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_015.png b/public/assets/avatars/presets/modern_015.png deleted file mode 100644 index 97ec793..0000000 Binary files a/public/assets/avatars/presets/modern_015.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_016.png b/public/assets/avatars/presets/modern_016.png deleted file mode 100644 index c78a267..0000000 Binary files a/public/assets/avatars/presets/modern_016.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_017.png b/public/assets/avatars/presets/modern_017.png deleted file mode 100644 index dab3449..0000000 Binary files a/public/assets/avatars/presets/modern_017.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_018.png b/public/assets/avatars/presets/modern_018.png deleted file mode 100644 index 6d8c7a1..0000000 Binary files a/public/assets/avatars/presets/modern_018.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_019.png b/public/assets/avatars/presets/modern_019.png deleted file mode 100644 index e104074..0000000 Binary files a/public/assets/avatars/presets/modern_019.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_020.png b/public/assets/avatars/presets/modern_020.png deleted file mode 100644 index 5b01c79..0000000 Binary files a/public/assets/avatars/presets/modern_020.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_021.png b/public/assets/avatars/presets/modern_021.png deleted file mode 100644 index 1c6768b..0000000 Binary files a/public/assets/avatars/presets/modern_021.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_022.png b/public/assets/avatars/presets/modern_022.png deleted file mode 100644 index c839577..0000000 Binary files a/public/assets/avatars/presets/modern_022.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_023.png b/public/assets/avatars/presets/modern_023.png deleted file mode 100644 index 3d16be9..0000000 Binary files a/public/assets/avatars/presets/modern_023.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_024.png b/public/assets/avatars/presets/modern_024.png deleted file mode 100644 index f82395b..0000000 Binary files a/public/assets/avatars/presets/modern_024.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_025.png b/public/assets/avatars/presets/modern_025.png deleted file mode 100644 index ce5f3ec..0000000 Binary files a/public/assets/avatars/presets/modern_025.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_026.png b/public/assets/avatars/presets/modern_026.png deleted file mode 100644 index afe0828..0000000 Binary files a/public/assets/avatars/presets/modern_026.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_027.png b/public/assets/avatars/presets/modern_027.png deleted file mode 100644 index 73d2f5f..0000000 Binary files a/public/assets/avatars/presets/modern_027.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_028.png b/public/assets/avatars/presets/modern_028.png deleted file mode 100644 index cc2ee71..0000000 Binary files a/public/assets/avatars/presets/modern_028.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_029.png b/public/assets/avatars/presets/modern_029.png deleted file mode 100644 index 389ea0f..0000000 Binary files a/public/assets/avatars/presets/modern_029.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_030.png b/public/assets/avatars/presets/modern_030.png deleted file mode 100644 index d0f2060..0000000 Binary files a/public/assets/avatars/presets/modern_030.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_031.png b/public/assets/avatars/presets/modern_031.png deleted file mode 100644 index 415e088..0000000 Binary files a/public/assets/avatars/presets/modern_031.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_032.png b/public/assets/avatars/presets/modern_032.png deleted file mode 100644 index fc6db14..0000000 Binary files a/public/assets/avatars/presets/modern_032.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_033.png b/public/assets/avatars/presets/modern_033.png deleted file mode 100644 index b0e879c..0000000 Binary files a/public/assets/avatars/presets/modern_033.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_034.png b/public/assets/avatars/presets/modern_034.png deleted file mode 100644 index 744dd02..0000000 Binary files a/public/assets/avatars/presets/modern_034.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_035.png b/public/assets/avatars/presets/modern_035.png deleted file mode 100644 index d7544e3..0000000 Binary files a/public/assets/avatars/presets/modern_035.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_036.png b/public/assets/avatars/presets/modern_036.png deleted file mode 100644 index f881b1d..0000000 Binary files a/public/assets/avatars/presets/modern_036.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_037.png b/public/assets/avatars/presets/modern_037.png deleted file mode 100644 index 02cae8a..0000000 Binary files a/public/assets/avatars/presets/modern_037.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_038.png b/public/assets/avatars/presets/modern_038.png deleted file mode 100644 index 6b949e6..0000000 Binary files a/public/assets/avatars/presets/modern_038.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_039.png b/public/assets/avatars/presets/modern_039.png deleted file mode 100644 index a8f723c..0000000 Binary files a/public/assets/avatars/presets/modern_039.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_040.png b/public/assets/avatars/presets/modern_040.png deleted file mode 100644 index bb3066e..0000000 Binary files a/public/assets/avatars/presets/modern_040.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_041.png b/public/assets/avatars/presets/modern_041.png deleted file mode 100644 index a4cb4c6..0000000 Binary files a/public/assets/avatars/presets/modern_041.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_042.png b/public/assets/avatars/presets/modern_042.png deleted file mode 100644 index 1a919e4..0000000 Binary files a/public/assets/avatars/presets/modern_042.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_043.png b/public/assets/avatars/presets/modern_043.png deleted file mode 100644 index 1adb599..0000000 Binary files a/public/assets/avatars/presets/modern_043.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_044.png b/public/assets/avatars/presets/modern_044.png deleted file mode 100644 index 17bdceb..0000000 Binary files a/public/assets/avatars/presets/modern_044.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_045.png b/public/assets/avatars/presets/modern_045.png deleted file mode 100644 index 8e40411..0000000 Binary files a/public/assets/avatars/presets/modern_045.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_046.png b/public/assets/avatars/presets/modern_046.png deleted file mode 100644 index cb31649..0000000 Binary files a/public/assets/avatars/presets/modern_046.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_047.png b/public/assets/avatars/presets/modern_047.png deleted file mode 100644 index 4915c31..0000000 Binary files a/public/assets/avatars/presets/modern_047.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_048.png b/public/assets/avatars/presets/modern_048.png deleted file mode 100644 index 33547cf..0000000 Binary files a/public/assets/avatars/presets/modern_048.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_049.png b/public/assets/avatars/presets/modern_049.png deleted file mode 100644 index 0196445..0000000 Binary files a/public/assets/avatars/presets/modern_049.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_050.png b/public/assets/avatars/presets/modern_050.png deleted file mode 100644 index 5aee445..0000000 Binary files a/public/assets/avatars/presets/modern_050.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_051.png b/public/assets/avatars/presets/modern_051.png deleted file mode 100644 index b249bed..0000000 Binary files a/public/assets/avatars/presets/modern_051.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_052.png b/public/assets/avatars/presets/modern_052.png deleted file mode 100644 index afd19d6..0000000 Binary files a/public/assets/avatars/presets/modern_052.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_053.png b/public/assets/avatars/presets/modern_053.png deleted file mode 100644 index ee30fd3..0000000 Binary files a/public/assets/avatars/presets/modern_053.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_054.png b/public/assets/avatars/presets/modern_054.png deleted file mode 100644 index c387c87..0000000 Binary files a/public/assets/avatars/presets/modern_054.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_055.png b/public/assets/avatars/presets/modern_055.png deleted file mode 100644 index cde53d6..0000000 Binary files a/public/assets/avatars/presets/modern_055.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_056.png b/public/assets/avatars/presets/modern_056.png deleted file mode 100644 index 0f8bb76..0000000 Binary files a/public/assets/avatars/presets/modern_056.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_057.png b/public/assets/avatars/presets/modern_057.png deleted file mode 100644 index f5001c5..0000000 Binary files a/public/assets/avatars/presets/modern_057.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_058.png b/public/assets/avatars/presets/modern_058.png deleted file mode 100644 index 34ca3c9..0000000 Binary files a/public/assets/avatars/presets/modern_058.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_059.png b/public/assets/avatars/presets/modern_059.png deleted file mode 100644 index fa46e66..0000000 Binary files a/public/assets/avatars/presets/modern_059.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_060.png b/public/assets/avatars/presets/modern_060.png deleted file mode 100644 index 50381ce..0000000 Binary files a/public/assets/avatars/presets/modern_060.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_061.png b/public/assets/avatars/presets/modern_061.png deleted file mode 100644 index ae1cc77..0000000 Binary files a/public/assets/avatars/presets/modern_061.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_062.png b/public/assets/avatars/presets/modern_062.png deleted file mode 100644 index eb9e5ce..0000000 Binary files a/public/assets/avatars/presets/modern_062.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_063.png b/public/assets/avatars/presets/modern_063.png deleted file mode 100644 index b30aeb5..0000000 Binary files a/public/assets/avatars/presets/modern_063.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_064.png b/public/assets/avatars/presets/modern_064.png deleted file mode 100644 index 51f67a6..0000000 Binary files a/public/assets/avatars/presets/modern_064.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_065.png b/public/assets/avatars/presets/modern_065.png deleted file mode 100644 index c19c4e2..0000000 Binary files a/public/assets/avatars/presets/modern_065.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_066.png b/public/assets/avatars/presets/modern_066.png deleted file mode 100644 index 606cc12..0000000 Binary files a/public/assets/avatars/presets/modern_066.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_067.png b/public/assets/avatars/presets/modern_067.png deleted file mode 100644 index 94aaf9e..0000000 Binary files a/public/assets/avatars/presets/modern_067.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_068.png b/public/assets/avatars/presets/modern_068.png deleted file mode 100644 index a693bdf..0000000 Binary files a/public/assets/avatars/presets/modern_068.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_069.png b/public/assets/avatars/presets/modern_069.png deleted file mode 100644 index b7e2047..0000000 Binary files a/public/assets/avatars/presets/modern_069.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_070.png b/public/assets/avatars/presets/modern_070.png deleted file mode 100644 index 0928525..0000000 Binary files a/public/assets/avatars/presets/modern_070.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_071.png b/public/assets/avatars/presets/modern_071.png deleted file mode 100644 index 91b9506..0000000 Binary files a/public/assets/avatars/presets/modern_071.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_072.png b/public/assets/avatars/presets/modern_072.png deleted file mode 100644 index f83a646..0000000 Binary files a/public/assets/avatars/presets/modern_072.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_073.png b/public/assets/avatars/presets/modern_073.png deleted file mode 100644 index 5c94b29..0000000 Binary files a/public/assets/avatars/presets/modern_073.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_074.png b/public/assets/avatars/presets/modern_074.png deleted file mode 100644 index 0409b11..0000000 Binary files a/public/assets/avatars/presets/modern_074.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_075.png b/public/assets/avatars/presets/modern_075.png deleted file mode 100644 index e28f77a..0000000 Binary files a/public/assets/avatars/presets/modern_075.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_076.png b/public/assets/avatars/presets/modern_076.png deleted file mode 100644 index 757c51c..0000000 Binary files a/public/assets/avatars/presets/modern_076.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_077.png b/public/assets/avatars/presets/modern_077.png deleted file mode 100644 index baa965f..0000000 Binary files a/public/assets/avatars/presets/modern_077.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_078.png b/public/assets/avatars/presets/modern_078.png deleted file mode 100644 index b811a10..0000000 Binary files a/public/assets/avatars/presets/modern_078.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_079.png b/public/assets/avatars/presets/modern_079.png deleted file mode 100644 index 3d0162b..0000000 Binary files a/public/assets/avatars/presets/modern_079.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_080.png b/public/assets/avatars/presets/modern_080.png deleted file mode 100644 index d5ced01..0000000 Binary files a/public/assets/avatars/presets/modern_080.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_081.png b/public/assets/avatars/presets/modern_081.png deleted file mode 100644 index 406c40d..0000000 Binary files a/public/assets/avatars/presets/modern_081.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_082.png b/public/assets/avatars/presets/modern_082.png deleted file mode 100644 index 1d7f06e..0000000 Binary files a/public/assets/avatars/presets/modern_082.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_083.png b/public/assets/avatars/presets/modern_083.png deleted file mode 100644 index 6129f1b..0000000 Binary files a/public/assets/avatars/presets/modern_083.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_084.png b/public/assets/avatars/presets/modern_084.png deleted file mode 100644 index d3f3334..0000000 Binary files a/public/assets/avatars/presets/modern_084.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_085.png b/public/assets/avatars/presets/modern_085.png deleted file mode 100644 index a9c5f56..0000000 Binary files a/public/assets/avatars/presets/modern_085.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_086.png b/public/assets/avatars/presets/modern_086.png deleted file mode 100644 index 9391698..0000000 Binary files a/public/assets/avatars/presets/modern_086.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_087.png b/public/assets/avatars/presets/modern_087.png deleted file mode 100644 index 9c117d6..0000000 Binary files a/public/assets/avatars/presets/modern_087.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_088.png b/public/assets/avatars/presets/modern_088.png deleted file mode 100644 index 59e127a..0000000 Binary files a/public/assets/avatars/presets/modern_088.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_089.png b/public/assets/avatars/presets/modern_089.png deleted file mode 100644 index b9c0251..0000000 Binary files a/public/assets/avatars/presets/modern_089.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_090.png b/public/assets/avatars/presets/modern_090.png deleted file mode 100644 index 05db369..0000000 Binary files a/public/assets/avatars/presets/modern_090.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_091.png b/public/assets/avatars/presets/modern_091.png deleted file mode 100644 index ec10cb6..0000000 Binary files a/public/assets/avatars/presets/modern_091.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_092.png b/public/assets/avatars/presets/modern_092.png deleted file mode 100644 index a4cfac9..0000000 Binary files a/public/assets/avatars/presets/modern_092.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_093.png b/public/assets/avatars/presets/modern_093.png deleted file mode 100644 index cf7f591..0000000 Binary files a/public/assets/avatars/presets/modern_093.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_094.png b/public/assets/avatars/presets/modern_094.png deleted file mode 100644 index 0226046..0000000 Binary files a/public/assets/avatars/presets/modern_094.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_095.png b/public/assets/avatars/presets/modern_095.png deleted file mode 100644 index 90d398f..0000000 Binary files a/public/assets/avatars/presets/modern_095.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_096.png b/public/assets/avatars/presets/modern_096.png deleted file mode 100644 index e622def..0000000 Binary files a/public/assets/avatars/presets/modern_096.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_097.png b/public/assets/avatars/presets/modern_097.png deleted file mode 100644 index d824ff6..0000000 Binary files a/public/assets/avatars/presets/modern_097.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_098.png b/public/assets/avatars/presets/modern_098.png deleted file mode 100644 index e0f4100..0000000 Binary files a/public/assets/avatars/presets/modern_098.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_099.png b/public/assets/avatars/presets/modern_099.png deleted file mode 100644 index 971e31e..0000000 Binary files a/public/assets/avatars/presets/modern_099.png and /dev/null differ diff --git a/public/assets/avatars/presets/modern_100.png b/public/assets/avatars/presets/modern_100.png deleted file mode 100644 index 9839405..0000000 Binary files a/public/assets/avatars/presets/modern_100.png and /dev/null differ diff --git a/public/assets/css/app.css b/public/assets/css/app.css index 3e0d4ad..e72bf0c 100755 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -256,21 +256,31 @@ body { .avatar-component-panel { display: none; width: 100%; gap: 10px; } .avatar-component-panel.is-active { display: grid; } .avatar-component-panel__head { display: flex; justify-content: space-between; gap: 10px; align-items: baseline; } -.avatar-component-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; max-height: 460px; overflow: auto; padding-right: 4px; } -.avatar-component-card { position: relative; display: grid; gap: 8px; padding: 10px; background: #fff; border: 1px solid var(--color-border); border-radius: 16px; cursor: pointer; } +.avatar-component-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; max-height: 420px; overflow: auto; padding-right: 4px; } +.avatar-component-card { position: relative; display: grid; gap: 6px; padding: 8px; background: #fff; border: 1px solid var(--color-border); border-radius: 16px; cursor: pointer; } .avatar-component-card input { position: absolute; opacity: 0; pointer-events: none; } .avatar-component-card__thumb { display: block; aspect-ratio: 1; border-radius: 14px; overflow: hidden; background: linear-gradient(180deg, #f7efe6, #f0e4d7); border: 1px solid rgba(74, 52, 38, 0.08); } .avatar-component-card__thumb img { width: 100%; height: 100%; object-fit: cover; object-position: center top; display: block; transform-origin: center; } .avatar-component-card__label { font-size: 12px; font-weight: 700; color: var(--color-text); text-align: center; } .avatar-component-card:has(input:checked) { border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(52,72,90,0.14); } .avatar-component-panel--eyes .avatar-component-card__thumb img, -.avatar-component-panel--eyebrows .avatar-component-card__thumb img { transform: scale(2.5) translateY(-14%); } -.avatar-component-panel--mouth .avatar-component-card__thumb img { transform: scale(2.45) translateY(14%); } -.avatar-component-panel--glasses .avatar-component-card__thumb img { transform: scale(2.25) translateY(-6%); } -.avatar-component-panel--hair .avatar-component-card__thumb img { transform: scale(2.2) translateY(-26%); } -.avatar-component-panel--beard .avatar-component-card__thumb img { transform: scale(2.3) translateY(8%); } -.avatar-component-panel--earrings .avatar-component-card__thumb img { transform: scale(2.15) translateY(-2%); } -@media (max-width: 860px){ .avatar-component-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } +.avatar-component-panel--eyebrows .avatar-component-card__thumb img { transform: scale(2.05) translateY(-12%); } +.avatar-component-panel--mouth .avatar-component-card__thumb img { transform: scale(2.0) translateY(10%); } +.avatar-component-panel--glasses .avatar-component-card__thumb img { transform: scale(1.95) translateY(-4%); } +.avatar-component-panel--hair .avatar-component-card__thumb img { transform: scale(1.9) translateY(-20%); } +.avatar-component-panel--beard .avatar-component-card__thumb img { transform: scale(1.95) translateY(7%); } +.avatar-component-panel--earrings .avatar-component-card__thumb img { transform: scale(1.85) translateY(-1%); } +.avatar-seed-picker { width: 100%; display: grid; gap: 12px; padding: 18px; background: rgba(255,255,255,0.82); border: 1px solid var(--color-border); border-radius: 18px; } +.avatar-seed-picker[hidden] { display: none; } +.avatar-seed-picker__head { display: flex; justify-content: space-between; gap: 12px; align-items: center; } +.avatar-seed-picker__grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; } +.avatar-seed-card { display: grid; gap: 8px; padding: 10px; border: 1px solid var(--color-border); border-radius: 16px; background: #fff; cursor: pointer; } +.avatar-seed-card:hover { border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(52,72,90,0.08); } +.avatar-seed-card__thumb { display: block; aspect-ratio: 1; border-radius: 14px; overflow: hidden; background: linear-gradient(180deg, #f7efe6, #f0e4d7); border: 1px solid rgba(74, 52, 38, 0.08); } +.avatar-seed-card__thumb img { width: 100%; height: 100%; display: block; object-fit: cover; } +.avatar-seed-card__label { text-align: center; font-size: 12px; font-weight: 700; } +@media (max-width: 980px){ .avatar-component-grid, .avatar-seed-picker__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } } +@media (max-width: 860px){ .avatar-component-grid, .avatar-seed-picker__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } .avatar-swatch-group { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; } .avatar-swatch { display: grid; grid-template-columns: 20px 18px minmax(0, 1fr); gap: 10px; align-items: center; padding: 10px 12px; border: 1px solid var(--color-border); border-radius: 14px; background: #fff; cursor: pointer; } .avatar-swatch__color { width: 18px; height: 18px; border-radius: 999px; background: var(--swatch-color); border: 1px solid rgba(0,0,0,0.12); } diff --git a/public/assets/js/app.js b/public/assets/js/app.js index f7391c2..7846d68 100755 --- a/public/assets/js/app.js +++ b/public/assets/js/app.js @@ -726,36 +726,49 @@ document.addEventListener('DOMContentLoaded', () => { }); document.addEventListener('pkt:open-consent', openConsentModal); + const readAvatarValue = (form, field) => { + const checked = form.querySelector(`[data-avatar-field="${field}"]:checked`); + if (checked) return checked.value; + const input = form.querySelector(`[data-avatar-field="${field}"]`); + return input ? input.value : ''; + }; + + const avatarComponentFieldMap = { + avatar_lorelei_eyes_variant: 'eyesVariant', + avatar_lorelei_eyebrows_variant: 'eyebrowsVariant', + avatar_lorelei_mouth_variant: 'mouthVariant', + avatar_lorelei_glasses_variant: 'glassesVariant', + avatar_lorelei_hair_variant: 'hairVariant', + avatar_lorelei_beard_variant: 'beardVariant', + avatar_lorelei_earrings_variant: 'earringsVariant', + }; + + const avatarComponentFields = Object.keys(avatarComponentFieldMap); + + const buildAvatarParams = (form, overrides = {}) => { + const seed = overrides.avatar_preset || readAvatarValue(form, 'avatar_preset'); + if (!seed) return null; + + const params = new URLSearchParams({ seed }); + avatarComponentFields.forEach((field) => { + const value = Object.prototype.hasOwnProperty.call(overrides, field) + ? overrides[field] + : readAvatarValue(form, field); + const param = avatarComponentFieldMap[field]; + if (value && param) params.set(param, value); + }); + + return params; + }; + const updateAvatarPreview = (form) => { const preview = form.querySelector('[data-avatar-preview] .pkt-avatar'); if (!preview) return; - - const readValue = (field) => { - const checked = form.querySelector(`[data-avatar-field="${field}"]:checked`); - if (checked) return checked.value; - const input = form.querySelector(`[data-avatar-field="${field}"]`); - return input ? input.value : ''; - }; const image = preview.querySelector('.pkt-avatar__img'); if (!image) return; - const checked = form.querySelector('[data-avatar-field="avatar_preset"]:checked'); - const seed = checked?.value || ''; - if (!seed) return; - - const params = new URLSearchParams({ seed }); - [ - ['avatar_lorelei_eyes_variant', 'eyesVariant'], - ['avatar_lorelei_eyebrows_variant', 'eyebrowsVariant'], - ['avatar_lorelei_mouth_variant', 'mouthVariant'], - ['avatar_lorelei_glasses_variant', 'glassesVariant'], - ['avatar_lorelei_hair_variant', 'hairVariant'], - ['avatar_lorelei_beard_variant', 'beardVariant'], - ['avatar_lorelei_earrings_variant', 'earringsVariant'], - ].forEach(([field, param]) => { - const value = readValue(field); - if (value) params.set(param, value); - }); + const params = buildAvatarParams(form); + if (!params) return; const url = `/api/avatar?${params.toString()}`; if (!url) return; @@ -763,48 +776,50 @@ document.addEventListener('DOMContentLoaded', () => { }; const updateAvatarOptionPreviews = (form) => { - const baseSeed = readValue('avatar_preset'); - if (!baseSeed) return; - - const currentValues = {}; - [ - 'avatar_lorelei_eyes_variant', - 'avatar_lorelei_eyebrows_variant', - 'avatar_lorelei_mouth_variant', - 'avatar_lorelei_glasses_variant', - 'avatar_lorelei_hair_variant', - 'avatar_lorelei_beard_variant', - 'avatar_lorelei_earrings_variant', - ].forEach((field) => { - const checkedField = form.querySelector(`[data-avatar-field="${field}"]:checked`); - currentValues[field] = checkedField ? checkedField.value : ''; - }); - - const fieldMap = { - avatar_lorelei_eyes_variant: 'eyesVariant', - avatar_lorelei_eyebrows_variant: 'eyebrowsVariant', - avatar_lorelei_mouth_variant: 'mouthVariant', - avatar_lorelei_glasses_variant: 'glassesVariant', - avatar_lorelei_hair_variant: 'hairVariant', - avatar_lorelei_beard_variant: 'beardVariant', - avatar_lorelei_earrings_variant: 'earringsVariant', - }; - form.querySelectorAll('[data-avatar-option-thumb]').forEach((image) => { const field = image.getAttribute('data-avatar-option-field') || ''; const value = image.getAttribute('data-avatar-option-value') || ''; - const params = new URLSearchParams({ seed: baseSeed }); - Object.entries(currentValues).forEach(([currentField, currentValue]) => { - const param = fieldMap[currentField]; - if (!param) return; - const appliedValue = currentField === field ? value : currentValue; - if (appliedValue) params.set(param, appliedValue); - }); + const params = buildAvatarParams(form, { [field]: value }); + if (!params) return; image.src = `/api/avatar?${params.toString()}`; }); }; + const renderAvatarSeedChoices = (form, seeds) => { + const picker = form.querySelector('[data-avatar-seed-picker]'); + const grid = form.querySelector('[data-avatar-seed-picker-grid]'); + if (!picker || !grid) return; + + grid.innerHTML = ''; + seeds.forEach((seed, index) => { + const params = buildAvatarParams(form, { avatar_preset: seed }); + if (!params) return; + + const card = document.createElement('button'); + card.type = 'button'; + card.className = 'avatar-seed-card'; + card.setAttribute('data-avatar-seed-option', seed); + card.innerHTML = ` + + Grundvariante ${index + 1} + + Variante ${index + 1} + `; + card.addEventListener('click', () => { + const seedField = form.querySelector('[data-avatar-field="avatar_preset"]'); + if (!(seedField instanceof HTMLInputElement)) return; + seedField.value = seed; + picker.hidden = true; + updateAvatarPreview(form); + updateAvatarOptionPreviews(form); + }); + grid.appendChild(card); + }); + + picker.hidden = false; + }; + document.querySelectorAll('[data-avatar-builder]').forEach((form) => { updateAvatarPreview(form); updateAvatarOptionPreviews(form); @@ -837,15 +852,7 @@ document.addEventListener('DOMContentLoaded', () => { }); }); - [ - 'avatar_lorelei_eyes_variant', - 'avatar_lorelei_eyebrows_variant', - 'avatar_lorelei_mouth_variant', - 'avatar_lorelei_glasses_variant', - 'avatar_lorelei_hair_variant', - 'avatar_lorelei_beard_variant', - 'avatar_lorelei_earrings_variant', - ].forEach((field) => { + avatarComponentFields.forEach((field) => { form.querySelectorAll(`[data-avatar-field="${field}"]`).forEach((input) => { input.addEventListener('change', () => setActiveComponentPanel(field)); }); @@ -866,7 +873,6 @@ document.addEventListener('DOMContentLoaded', () => { 'veit', 'vito', 'yaro', 'yuri', 'zeno', 'zuri', ]; const slugifySeed = (value) => value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 64) || 'papa-kind-treff'; - const dicebearUrl = (seed) => `/api/avatar?seed=${encodeURIComponent(seed)}`; const buildSeed = () => { const prefix = avatarPrefixes[Math.floor(Math.random() * avatarPrefixes.length)]; const suffix = avatarSuffixes[Math.floor(Math.random() * avatarSuffixes.length)]; @@ -877,9 +883,20 @@ document.addEventListener('DOMContentLoaded', () => { form.querySelector('[data-avatar-reroll]')?.addEventListener('click', () => { const seedField = form.querySelector('[data-avatar-field="avatar_preset"]'); if (!(seedField instanceof HTMLInputElement)) return; - seedField.value = buildSeed(); - updateAvatarPreview(form); - updateAvatarOptionPreviews(form); + const currentSeed = readAvatarValue(form, 'avatar_preset'); + const seeds = []; + while (seeds.length < 8) { + const candidate = buildSeed(); + if (candidate === currentSeed || seeds.includes(candidate)) continue; + seeds.push(candidate); + } + + renderAvatarSeedChoices(form, seeds); + }); + + form.querySelector('[data-avatar-seed-picker-close]')?.addEventListener('click', () => { + const picker = form.querySelector('[data-avatar-seed-picker]'); + if (picker) picker.hidden = true; }); }); diff --git a/src/App/AccountPages.php b/src/App/AccountPages.php index 68f3dd4..b2de846 100755 --- a/src/App/AccountPages.php +++ b/src/App/AccountPages.php @@ -419,7 +419,6 @@ final class AccountPages $section = 'profile'; } $avatarOptions = Lorelei::options(); - $avatarPresetOptions = Lorelei::seedChoices((string)$profile['avatar_preset']); return compact( 'flash', @@ -437,7 +436,6 @@ final class AccountPages 'communityCanApply', 'communityRestrictions', 'avatarOptions', - 'avatarPresetOptions', 'section', 'allowedSections' ); diff --git a/src/App/Avatar/Lorelei.php b/src/App/Avatar/Lorelei.php index 795cd06..121a55c 100644 --- a/src/App/Avatar/Lorelei.php +++ b/src/App/Avatar/Lorelei.php @@ -93,60 +93,6 @@ final class Lorelei return substr($seed, 0, 64); } - public static function seedChoices(string $selectedSeed, int $count = 24): array - { - $selectedSeed = self::normalizeSeed($selectedSeed); - $prefixes = [ - 'abend', 'ahorn', 'anker', 'atlas', 'berg', 'blick', 'brise', 'echo', - 'eiche', 'fjord', 'fluss', 'fokus', 'hafen', 'herz', 'horizont', 'insel', - 'kiesel', 'kompass', 'kraft', 'linie', 'licht', 'lotse', 'mond', 'morgen', - 'nord', 'pfad', 'quelle', 'rauch', 'runde', 'sand', 'sommer', 'stein', - 'sturm', 'tal', 'ufer', 'wald', 'welle', 'wind', 'winkel', 'zeit', - ]; - $suffixes = [ - 'alpha', 'atlas', 'balu', 'bravo', 'caspar', 'dario', 'emil', 'felix', - 'fiete', 'finn', 'gerrit', 'hanno', 'ilan', 'joris', 'kian', 'leon', - 'linus', 'maik', 'malo', 'marlon', 'mats', 'mika', 'milan', 'noel', - 'ole', 'oskar', 'pepe', 'quinn', 'remo', 'sam', 'taro', 'timo', - 'veit', 'vito', 'yaro', 'yuri', 'zeno', 'zuri', - ]; - - $choices = [[ - 'seed' => $selectedSeed, - 'label' => 'Aktuelle Auswahl', - 'image' => self::dicebearUrl($selectedSeed), - ]]; - - $seen = [$selectedSeed => true]; - $base = abs((int) crc32($selectedSeed)); - $index = 0; - - while (count($choices) < $count) { - $prefix = $prefixes[($base + ($index * 7)) % count($prefixes)]; - $suffix = $suffixes[($base + ($index * 11)) % count($suffixes)]; - $candidate = self::normalizeSeed($prefix . '-' . $suffix . '-' . (($base + $index) % 997)); - $index++; - - if (isset($seen[$candidate])) { - continue; - } - - $seen[$candidate] = true; - $choices[] = [ - 'seed' => $candidate, - 'label' => 'Variante ' . count($choices), - 'image' => self::dicebearUrl($candidate), - ]; - } - - return $choices; - } - - public static function dicebearUrl(string $seed): string - { - return '/api/avatar?seed=' . rawurlencode(self::normalizeSeed($seed)); - } - public static function apiQuery(array $row): array { $avatar = self::normalize($row); @@ -210,7 +156,7 @@ final class Lorelei htmlspecialchars(implode(' ', [ 'pkt-avatar', 'pkt-avatar--' . preg_replace('/[^a-z0-9\-]/', '', strtolower($size)), - 'pkt-avatar--preset', + 'pkt-avatar--generated', ]), ENT_QUOTES), htmlspecialchars('Avatar von ' . $name, ENT_QUOTES), htmlspecialchars($src, ENT_QUOTES)