Eigenes Logo und Favicon je Installation
Beides ist optional und wird ueber Einstellungen -> Darstellung gesetzt. Ohne eigenes Bild bleibt alles wie bisher. Ablage bewusst in der Datenbank (Tabelle branding_assets) und nicht im Dateisystem: So liegt das Bild automatisch im Backup, und das Deployment braucht kein zusaetzliches Volume. Es geht um wenige Kilobyte; der Upload ist auf 512 KB und auf Bildformate begrenzt, die ein Browser auch wirklich darstellt. Das Abrufen ist ohne Anmeldung moeglich, weil der Browser das Favicon schon vor dem Login holt - hochladen und entfernen duerfen nur Administratoren. Das Logo ersetzt in der Seitenleiste und auf der Anmeldeseite Zeichen und Schriftzug zusammen. Damit ein zu grosses oder sehr breites Bild das Layout nicht auseinanderziehen kann, ist die Hoehe per CSS gedeckelt und die Breite auf den Container begrenzt; object-fit haelt das Seitenverhaeltnis. Faellt das Laden fehl, erscheint wieder das eingebaute Zeichen. Als Standard-Favicon dient derselbe Barcode-Glyph wie im App-Icon, damit Web und iOS-App zusammenpassen. Getestet: Die Endpunkte sind gegen die laufende API geprueft - hochladen, abrufen ohne Anmeldung, Abweisen von falschem Dateityp (400), zu grosser Datei (400), unbekannter Bildart (404) und fehlenden Rechten (401), entfernen und der Rueckfall auf 404 danach. Web-Build laeuft durch, 40 pytest-Tests gruen. Die Darstellung im Browser habe ich nicht selbst angesehen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -73,6 +73,30 @@ h2 { font-size: 0.95rem; font-weight: 650; margin: 0 0 var(--sp-3); letter-spaci
|
||||
font-size: 1.05rem;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
/* Eigenes Logo. Die Deckelung ist Absicht: Ein sehr grosses oder sehr breites
|
||||
Bild darf die Seitenleiste nicht auseinanderziehen. Das Seitenverhaeltnis
|
||||
bleibt durch object-fit erhalten, ueberstehendes wird nicht abgeschnitten. */
|
||||
.brand-logo {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
max-height: 36px;
|
||||
width: auto;
|
||||
object-fit: contain;
|
||||
}
|
||||
/* Vorschau in den Einstellungen: Karomuster zeigt Transparenz. */
|
||||
.brand-preview {
|
||||
display: grid; place-items: center;
|
||||
min-height: 64px; padding: var(--sp-3);
|
||||
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
||||
background-color: var(--bg);
|
||||
background-image:
|
||||
linear-gradient(45deg, var(--border) 25%, transparent 25%, transparent 75%, var(--border) 75%),
|
||||
linear-gradient(45deg, var(--border) 25%, transparent 25%, transparent 75%, var(--border) 75%);
|
||||
background-size: 14px 14px;
|
||||
background-position: 0 0, 7px 7px;
|
||||
}
|
||||
.brand-preview img { max-width: 100%; max-height: 56px; width: auto; object-fit: contain; }
|
||||
|
||||
.sidebar-brand .mark {
|
||||
display: grid; place-items: center;
|
||||
width: 28px; height: 28px; border-radius: var(--radius-sm);
|
||||
|
||||
Reference in New Issue
Block a user