Kritische Bugfixes: Export/CA-Download (Service-Worker), Speichern-Bug bei Diensten/Lesezeichen, Dark-Mode-Direktlink, Favicon-Mixed-Content-Proxy, Live-Update Zuletzt-besucht, Kategorie-Farb-Picker, Startseite-Nav

This commit is contained in:
2026-07-20 13:02:58 +02:00
parent 96cf29fef4
commit cc4b285aea
13 changed files with 286 additions and 65 deletions

View File

@@ -18,6 +18,18 @@ const SIZE_CLASSES: Record<NonNullable<FaviconProps["size"]>, string> = {
* einem fehlgeschlagenen Ladeversuch (kaputte URL, 404, CORS) wird
* stattdessen der erste Buchstabe des Namens gezeigt.
*/
/**
* Externe/Geräte-Favicons laufen über den Backend-Proxy (/api/favicon-proxy):
* Ohne das würden auf der HTTPS-Seite viele http://-Favicons (typisch für
* Homelab-Geräte ohne eigenes TLS) vom Browser als "Mixed Content" blockiert
* und nie angezeigt - das Backend selbst fetcht sie ohne diese Einschränkung.
* Data-URLs (z. B. selbst hochgeladene Icons) werden direkt durchgereicht.
*/
function resolveFaviconSrc(src: string): string {
if (src.startsWith("data:")) return src;
return `/api/favicon-proxy?url=${encodeURIComponent(src)}`;
}
export function Favicon({ src, fallbackLetter, size = "md" }: FaviconProps) {
const dimension = SIZE_CLASSES[size];
const [failed, setFailed] = useState(false);
@@ -46,7 +58,7 @@ export function Favicon({ src, fallbackLetter, size = "md" }: FaviconProps) {
bg-white p-0.5 ring-1 ring-black/5`}
>
<img
src={src}
src={resolveFaviconSrc(src)}
alt=""
className="h-full w-full object-contain"
onError={() => setFailed(true)}