feat(pwa): als App installierbar
Web-Manifest mit eigenen Symbolen; auf dem Handy laesst sich Nebula zum Startbildschirm hinzufuegen und laeuft dann ohne Adressleiste. Das Manifest entsteht wie die uebrigen Metadaten aus einer Funktion, nicht aus einer Konstanten: nur so wird APP_NAME zur Laufzeit gelesen und das fertige Docker-Image bleibt umbenennbar. Manifest und Symbole muessen an der Zugangsschranke vorbei - der Browser holt sie, bevor sich jemand angemeldet hat. Sonst landeten sie auf der Anmeldeseite und die Anwendung waere nicht installierbar. Die maskierbare Fassung hat mehr Rand: Android schneidet Symbole je nach Geraet rund, eckig oder als Tropfen zu. Die PNGs sind aus dem vorhandenen SVG mit Chrome erzeugt - das spart eine Bildbibliothek als Abhaengigkeit. Beim Ergaenzen des Apple-Symbols ist mir aufgefallen, dass ein eigener icons-Eintrag den Verweis ersetzt, den Next aus app/icon.svg von selbst erzeugt: die Seite hatte danach gar kein Symbol mehr und der Browser fiel auf /favicon.ico zurueck, das es hier nicht gibt. Beide Eintraege stehen jetzt ausdruecklich da, ein Test prueft den Verweis. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+11
-2
@@ -20,12 +20,21 @@ const SESSION_COOKIE = "nebula_session";
|
||||
/** Ohne Anmeldung erreichbar. */
|
||||
const PUBLIC_PATHS = ["/login", "/setup", "/register"];
|
||||
const PUBLIC_API_PREFIXES = ["/api/auth/"];
|
||||
/** Der Docker-Healthcheck hat kein Cookie. */
|
||||
const PUBLIC_API_EXACT = ["/api/health"];
|
||||
/**
|
||||
* Der Docker-Healthcheck hat kein Cookie. Manifest und Symbole braucht der
|
||||
* Browser, bevor sich jemand angemeldet hat – wuerden sie zur Anmeldeseite
|
||||
* umgeleitet, liesse sich die Anwendung nicht installieren und die
|
||||
* Anmeldeseite haette kein Symbol.
|
||||
*/
|
||||
const PUBLIC_API_EXACT = ["/api/health", "/manifest.webmanifest"];
|
||||
|
||||
/** Bilder und aehnliches im Wurzelverzeichnis verraten nichts. */
|
||||
const PUBLIC_FILE = /\.(png|svg|ico|webmanifest|txt|webp)$/;
|
||||
|
||||
function isPublicPath(pathname: string): boolean {
|
||||
if (PUBLIC_PATHS.includes(pathname)) return true;
|
||||
if (PUBLIC_API_EXACT.includes(pathname)) return true;
|
||||
if (PUBLIC_FILE.test(pathname)) return true;
|
||||
return PUBLIC_API_PREFIXES.some((prefix) => pathname.startsWith(prefix));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user