import "./css/style.css" import App from "./App.svelte" import { hydrate } from "svelte" import { setupI18n } from "./lib/i18n/index" /** * Ein Fehlschlag beim Start darf nicht stillschweigend bleiben. * * Ohne i18n gibt es keine Labels, und `hydrate()` kann werfen, wenn das * Server-Markup vom Client abweicht. In beiden Fällen bleibt das * ausgelieferte HTML stehen: der Besucher sieht eine tote Seite ohne jeden * Hinweis, und für einen Test ist das nicht unterscheidbar von "noch nicht * fertig". */ function markBootFailed(stage: string, error: unknown) { console.error(`[app] Start fehlgeschlagen (${stage}):`, error) document?.getElementById("appContainer")?.setAttribute("data-app-ready", "error") } // Initialize i18n before mounting the app setupI18n() .then(() => { let appContainer = document?.getElementById("appContainer") try { hydrate(App, { target: appContainer }) } catch (error) { markBootFailed("hydrate", error) return } // Signal "die App ist hydration gelaufen": erst gesetzt, wenn i18n // geladen und der erste Render abgeschlossen ist. // // Ohne das gibt es keinen zuverlässigen Zeitpunkt, an dem die Seite // fertig ist. `domcontentloaded` sagt nichts über den Zustand des // Containers aus, und wer auf "Inhalt vorhanden" wartet, wartet auf // etwas, das auch nach 15 s nicht kommen muss. appContainer?.setAttribute("data-app-ready", "true") }) .catch((error: unknown) => markBootFailed("i18n", error))