@@ -1,10 +1,9 @@
|
||||
Anweisung: Projektstruktur (Basis-Template) wie in „papa-kind-treff“
|
||||
|
||||
Aktueller Projektstand
|
||||
- Papa-Kind-Treff nutzt im Mitgliederbereich einen modernen Avatar-Generator auf Layer-Basis.
|
||||
- Die Avatare bestehen aus getrennten SVG-Ebenen für Kopf, Haare, Bart, Brille, Mütze, Outfit und Farben.
|
||||
- Papa-Kind-Treff nutzt im Mitgliederbereich 100 moderne Portrait-Presets im gewünschten Referenzstil.
|
||||
- Relevante Logik liegt in `src/App/Avatar.php`.
|
||||
- Die Layer-Assets liegen unter `public/assets/avatars/layers/modern/`.
|
||||
- Die Preset-Assets liegen unter `public/assets/avatars/presets/`.
|
||||
- Ä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
|
||||
|
||||
@@ -19,13 +19,13 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l
|
||||
- Die Community ist hierarchisch aufgebaut: Kategorien -> Boards -> Threads -> Posts.
|
||||
- Moderation ist getrennt vom normalen Community-Frontend in einem eigenen Adminbereich.
|
||||
- Standortfunktionen sind relevant für lokale Treffen und werden künftig weiter ausgebaut.
|
||||
- Profilbilder werden aktuell über einen modernen Layer-Generator mit getrennten SVG-Ebenen statt über freie Bild-Uploads erzeugt.
|
||||
- Profilbilder werden aktuell über 100 moderne Preset-Portraits im gewünschten Referenzstil statt über freie Bild-Uploads erzeugt.
|
||||
|
||||
## 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 seinen Avatar über Layer für Kopfform, Haare, Bart, Brille, Mütze, Outfit und Farbwelten zusammenstellen.
|
||||
- Im Profil kann der Nutzer aktuell aus 100 modernen Preset-Varianten wählen, gruppiert nach Hauttönen.
|
||||
- Debug ist kein Menüpunkt und erscheint nur als Floating-Käfer für `site_admin` bei aktivem Debug-Modus.
|
||||
|
||||
## Community und Rechte
|
||||
|
||||
@@ -17,7 +17,7 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter mit Fokus auf lokale
|
||||
- Impressum, Datenschutz-&-Cookies-Seite und Über-uns
|
||||
- standortbasierte Sortierung für die neuesten Treffen
|
||||
- eigener Einstellungsbereich für Standortfreigabe, Browser-Hinweise und Consent-Verwaltung
|
||||
- moderner Avatar-Generator auf Layer-Basis mit kombinierbaren SVG-Elementen für Kopf, Haare, Bart, Brille, Mütze, Outfit und Farben
|
||||
- modernes Avatar-System auf Basis von 100 festen Portrait-Presets im Referenzstil, gruppiert nach Hauttönen
|
||||
- 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`
|
||||
|
||||
@@ -67,7 +67,7 @@ $sectionLinks = [
|
||||
</div>
|
||||
<div class="profile-avatar-panel__content">
|
||||
<h3>Dein Profilbild</h3>
|
||||
<p class="muted">Stell dir mit wenigen Klicks ein wiedererkennbares Community-Bild zusammen. Du kannst Haut, Haare, Augen, Bart, Brille und Kopfform direkt anpassen.</p>
|
||||
<p class="muted">Wähle ein modernes Portrait im Stil der Community. Die Varianten bleiben konsistent, frisch und deutlich näher an der gewünschten Optik.</p>
|
||||
<button class="btn" type="button" data-modal-open="modalAvatar">Profilbild gestalten</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -302,121 +302,39 @@ $sectionLinks = [
|
||||
<div data-avatar-preview>
|
||||
<?= \App\Avatar::render($profile, $profile['display_name'] ?: 'Papa', 'xxl') ?>
|
||||
</div>
|
||||
<p class="muted small">Stell dein Portrait direkt aus Haaren, Bart, Brille, Mütze, Outfit und Farben zusammen. Die Vorschau wird sofort aktualisiert.</p>
|
||||
<p class="muted small">Wähle zuerst einen Hautton-Bereich und dann eine passende Variante. Die Vorschau aktualisiert sich sofort.</p>
|
||||
</div>
|
||||
<div class="avatar-builder__controls">
|
||||
<div class="stack gap-6">
|
||||
<label class="label" for="avatarHeadShape">Kopfform</label>
|
||||
<select id="avatarHeadShape" name="avatar_head_shape" class="select" data-avatar-field="avatar_head_shape">
|
||||
<?php foreach ($avatarOptions['avatar_head_shape'] as $value => $label): ?>
|
||||
<option value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" <?= $profile['avatar_head_shape'] === $value ? 'selected' : '' ?>><?= htmlspecialchars((string)$label, ENT_QUOTES) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<div class="avatar-preset-filters" role="tablist" aria-label="Hauttöne filtern">
|
||||
<?php foreach ($avatarPresetGroups as $groupKey => $groupMeta): ?>
|
||||
<button
|
||||
type="button"
|
||||
class="avatar-preset-filter <?= $groupKey === 'fair' ? 'is-active' : '' ?>"
|
||||
data-avatar-preset-filter="<?= htmlspecialchars((string)$groupKey, ENT_QUOTES) ?>"
|
||||
role="tab"
|
||||
aria-selected="<?= $groupKey === 'fair' ? 'true' : 'false' ?>"
|
||||
>
|
||||
<?= htmlspecialchars((string)$groupMeta['label'], ENT_QUOTES) ?>
|
||||
</button>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<div class="stack gap-6">
|
||||
<label class="label" for="avatarHairStyle">Haarform</label>
|
||||
<select id="avatarHairStyle" name="avatar_hair_style" class="select" data-avatar-field="avatar_hair_style">
|
||||
<?php foreach ($avatarOptions['avatar_hair_style'] as $value => $label): ?>
|
||||
<option value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" <?= $profile['avatar_hair_style'] === $value ? 'selected' : '' ?>><?= htmlspecialchars((string)$label, ENT_QUOTES) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="stack gap-6">
|
||||
<label class="label" for="avatarBeardStyle">Bart</label>
|
||||
<select id="avatarBeardStyle" name="avatar_beard_style" class="select" data-avatar-field="avatar_beard_style">
|
||||
<?php foreach ($avatarOptions['avatar_beard_style'] as $value => $label): ?>
|
||||
<option value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" <?= $profile['avatar_beard_style'] === $value ? 'selected' : '' ?>><?= htmlspecialchars((string)$label, ENT_QUOTES) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="stack gap-6">
|
||||
<label class="label" for="avatarGlassesStyle">Brille</label>
|
||||
<select id="avatarGlassesStyle" name="avatar_glasses_style" class="select" data-avatar-field="avatar_glasses_style">
|
||||
<?php foreach ($avatarOptions['avatar_glasses_style'] as $value => $label): ?>
|
||||
<option value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" <?= $profile['avatar_glasses_style'] === $value ? 'selected' : '' ?>><?= htmlspecialchars((string)$label, ENT_QUOTES) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="stack gap-6">
|
||||
<label class="label" for="avatarHatStyle">Mütze</label>
|
||||
<select id="avatarHatStyle" name="avatar_hat_style" class="select" data-avatar-field="avatar_hat_style">
|
||||
<?php foreach ($avatarOptions['avatar_hat_style'] as $value => $label): ?>
|
||||
<option value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" <?= $profile['avatar_hat_style'] === $value ? 'selected' : '' ?>><?= htmlspecialchars((string)$label, ENT_QUOTES) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="stack gap-6">
|
||||
<label class="label" for="avatarOutfitStyle">Outfit</label>
|
||||
<select id="avatarOutfitStyle" name="avatar_outfit_style" class="select" data-avatar-field="avatar_outfit_style">
|
||||
<?php foreach ($avatarOptions['avatar_outfit_style'] as $value => $label): ?>
|
||||
<option value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" <?= $profile['avatar_outfit_style'] === $value ? 'selected' : '' ?>><?= htmlspecialchars((string)$label, ENT_QUOTES) ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="stack gap-6">
|
||||
<span class="label">Hautfarbe</span>
|
||||
<div class="avatar-swatch-group">
|
||||
<?php foreach ($avatarOptions['avatar_skin_tone'] as $value => $meta): ?>
|
||||
<label class="avatar-swatch">
|
||||
<input type="radio" name="avatar_skin_tone" value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" data-avatar-field="avatar_skin_tone" data-avatar-color="<?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>" <?= $profile['avatar_skin_tone'] === $value ? 'checked' : '' ?>>
|
||||
<span class="avatar-swatch__color" style="--swatch-color: <?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>;"></span>
|
||||
<span><?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?></span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack gap-6">
|
||||
<span class="label">Haarfarbe</span>
|
||||
<div class="avatar-swatch-group">
|
||||
<?php foreach ($avatarOptions['avatar_hair_color'] as $value => $meta): ?>
|
||||
<label class="avatar-swatch">
|
||||
<input type="radio" name="avatar_hair_color" value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" data-avatar-field="avatar_hair_color" data-avatar-color="<?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>" <?= $profile['avatar_hair_color'] === $value ? 'checked' : '' ?>>
|
||||
<span class="avatar-swatch__color" style="--swatch-color: <?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>;"></span>
|
||||
<span><?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?></span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack gap-6">
|
||||
<span class="label">Augenfarbe</span>
|
||||
<div class="avatar-swatch-group">
|
||||
<?php foreach ($avatarOptions['avatar_eye_color'] as $value => $meta): ?>
|
||||
<label class="avatar-swatch">
|
||||
<input type="radio" name="avatar_eye_color" value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" data-avatar-field="avatar_eye_color" data-avatar-color="<?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>" <?= $profile['avatar_eye_color'] === $value ? 'checked' : '' ?>>
|
||||
<span class="avatar-swatch__color" style="--swatch-color: <?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>;"></span>
|
||||
<span><?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?></span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack gap-6">
|
||||
<span class="label">Mützenfarbe</span>
|
||||
<div class="avatar-swatch-group">
|
||||
<?php foreach ($avatarOptions['avatar_hat_color'] as $value => $meta): ?>
|
||||
<label class="avatar-swatch">
|
||||
<input type="radio" name="avatar_hat_color" value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" data-avatar-field="avatar_hat_color" data-avatar-color="<?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>" <?= $profile['avatar_hat_color'] === $value ? 'checked' : '' ?>>
|
||||
<span class="avatar-swatch__color" style="--swatch-color: <?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>;"></span>
|
||||
<span><?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?></span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stack gap-6">
|
||||
<span class="label">Outfit-Farbe</span>
|
||||
<div class="avatar-swatch-group">
|
||||
<?php foreach ($avatarOptions['avatar_outfit_color'] as $value => $meta): ?>
|
||||
<label class="avatar-swatch">
|
||||
<input type="radio" name="avatar_outfit_color" value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" data-avatar-field="avatar_outfit_color" data-avatar-color="<?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>" <?= $profile['avatar_outfit_color'] === $value ? 'checked' : '' ?>>
|
||||
<span class="avatar-swatch__color" style="--swatch-color: <?= htmlspecialchars((string)$meta['color'], ENT_QUOTES) ?>;"></span>
|
||||
<span><?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?></span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<span class="label">Variante wählen</span>
|
||||
<?php foreach ($avatarPresetOptions as $groupKey => $groupPresets): ?>
|
||||
<div class="avatar-preset-group <?= $groupKey === 'fair' ? 'is-active' : '' ?>" data-avatar-preset-group="<?= htmlspecialchars((string)$groupKey, ENT_QUOTES) ?>">
|
||||
<div class="avatar-preset-grid">
|
||||
<?php foreach ($groupPresets as $value => $meta): ?>
|
||||
<label class="avatar-preset-card">
|
||||
<input type="radio" name="avatar_preset" value="<?= htmlspecialchars((string)$value, ENT_QUOTES) ?>" data-avatar-field="avatar_preset" <?= $profile['avatar_preset'] === $value ? 'checked' : '' ?>>
|
||||
<span class="avatar-preset-card__thumb">
|
||||
<img src="<?= htmlspecialchars((string)($meta['image'] ?? ''), ENT_QUOTES) ?>" alt="<?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?>">
|
||||
</span>
|
||||
<span class="avatar-preset-card__label"><?= htmlspecialchars((string)$meta['label'], ENT_QUOTES) ?></span>
|
||||
</label>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
BIN
public/assets/avatars/presets/modern_001.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_002.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_003.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_004.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_005.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_006.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/assets/avatars/presets/modern_007.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_008.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/assets/avatars/presets/modern_009.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/assets/avatars/presets/modern_010.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/assets/avatars/presets/modern_011.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_012.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
public/assets/avatars/presets/modern_013.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
public/assets/avatars/presets/modern_014.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/assets/avatars/presets/modern_015.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_016.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/assets/avatars/presets/modern_017.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/assets/avatars/presets/modern_018.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_019.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
public/assets/avatars/presets/modern_020.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
public/assets/avatars/presets/modern_021.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_022.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/assets/avatars/presets/modern_023.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_024.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_025.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_026.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/assets/avatars/presets/modern_027.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/assets/avatars/presets/modern_028.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
public/assets/avatars/presets/modern_029.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/assets/avatars/presets/modern_030.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
public/assets/avatars/presets/modern_031.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_032.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
public/assets/avatars/presets/modern_033.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_034.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_035.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_036.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/assets/avatars/presets/modern_037.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/assets/avatars/presets/modern_038.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_039.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/assets/avatars/presets/modern_040.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
public/assets/avatars/presets/modern_041.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/assets/avatars/presets/modern_042.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/assets/avatars/presets/modern_043.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/assets/avatars/presets/modern_044.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_045.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_046.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/assets/avatars/presets/modern_047.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_048.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
public/assets/avatars/presets/modern_049.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/assets/avatars/presets/modern_050.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_051.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/assets/avatars/presets/modern_052.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
public/assets/avatars/presets/modern_053.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_054.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/assets/avatars/presets/modern_055.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_056.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/assets/avatars/presets/modern_057.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/assets/avatars/presets/modern_058.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/assets/avatars/presets/modern_059.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/assets/avatars/presets/modern_060.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/assets/avatars/presets/modern_061.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/assets/avatars/presets/modern_062.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/assets/avatars/presets/modern_063.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_064.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/assets/avatars/presets/modern_065.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/assets/avatars/presets/modern_066.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/assets/avatars/presets/modern_067.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/assets/avatars/presets/modern_068.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/assets/avatars/presets/modern_069.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_070.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_071.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/assets/avatars/presets/modern_072.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
public/assets/avatars/presets/modern_073.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/assets/avatars/presets/modern_074.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/assets/avatars/presets/modern_075.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/assets/avatars/presets/modern_076.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
public/assets/avatars/presets/modern_077.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/assets/avatars/presets/modern_078.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/assets/avatars/presets/modern_079.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/assets/avatars/presets/modern_080.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
public/assets/avatars/presets/modern_081.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/assets/avatars/presets/modern_082.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/assets/avatars/presets/modern_083.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_084.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/assets/avatars/presets/modern_085.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/assets/avatars/presets/modern_086.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/assets/avatars/presets/modern_087.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/assets/avatars/presets/modern_088.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/assets/avatars/presets/modern_089.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_090.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/assets/avatars/presets/modern_091.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/assets/avatars/presets/modern_092.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/assets/avatars/presets/modern_093.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/assets/avatars/presets/modern_094.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/assets/avatars/presets/modern_095.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/assets/avatars/presets/modern_096.png
Normal file
|
After Width: | Height: | Size: 50 KiB |