diff --git a/src/lib/backButton.svelte.ts b/src/lib/backButton.svelte.ts index 6400709..06a6395 100644 --- a/src/lib/backButton.svelte.ts +++ b/src/lib/backButton.svelte.ts @@ -11,8 +11,8 @@ * 3. Auf der Hauptroute: 1. Tap = Hinweis, 2. Tap binnen 1,8 s = App beenden */ -import { App, type PluginListenerHandle } from '@capacitor/app'; -import { Capacitor } from '@capacitor/core'; +import { App } from '@capacitor/app'; +import { Capacitor, type PluginListenerHandle } from '@capacitor/core'; interface BackConfig { /** Schließt einen offenen Overlay-Zustand. true = verarbeitet, nichts weiter tun. */ diff --git a/src/lib/overlay.svelte.ts b/src/lib/overlay.svelte.ts new file mode 100644 index 0000000..6dfa446 --- /dev/null +++ b/src/lib/overlay.svelte.ts @@ -0,0 +1,32 @@ +/** + * Registry offener Overlays (Dialoge, Sheets, Bottom-Sheets). + * + * Damit der Hardware-Backbutton zuerst ein offenes Overlay schließt, statt + * gleich die Seite zu verlassen, meldet jedes Overlay beim Öffnen einen + * Schließen-Callback an. Der Backbutton-Handler (backButton.svelte.ts) ruft + * `closeTopOverlay()` und navigiert nur, wenn kein Overlay offen war. + * + * Modul-Scope, kein Svelte-State — Mehrfachregistrierung ist sicher. + */ + +const closers: Array<() => void> = []; + +/** + * Overlay anmelden, solange es geöffnet ist. + * Gibt die Abmeldefunktion zurück (im Svelte-$effect-Cleanup aufrufen). + */ +export function pushOverlay(close: () => void): () => void { + closers.push(close); + return () => { + const i = closers.lastIndexOf(close); + if (i >= 0) closers.splice(i, 1); + }; +} + +/** Oberstes Overlay schließen. Liefert true, wenn es eines zu schließen gab. */ +export function closeTopOverlay(): boolean { + const close = closers.pop(); + if (!close) return false; + close(); + return true; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 120e3f0..40a4773 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,13 +1,15 @@