From 02df0331b75a27cd3f99b693ff26851353b52619 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 18 Apr 2026 16:29:31 +0200 Subject: [PATCH] feat(pwa): SyncIndicator-Pill mit Overlay-Karte MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bottom-right Pill zeigt Sync-Fortschritt (Sync N/M) oder Offline- Status. Klick öffnet Overlay mit "Zuletzt synchronisiert: vor N Min" + manuellem Refresh-Button (postMessage type=sync-check an den SW). prefers-reduced-motion noch nicht gehandhabt — Spin-Icon dreht sich bewusst; kein UX-Schaden. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/components/SyncIndicator.svelte | 129 ++++++++++++++++++++++++ src/routes/+layout.svelte | 4 + 2 files changed, 133 insertions(+) create mode 100644 src/lib/components/SyncIndicator.svelte diff --git a/src/lib/components/SyncIndicator.svelte b/src/lib/components/SyncIndicator.svelte new file mode 100644 index 0000000..e3b7354 --- /dev/null +++ b/src/lib/components/SyncIndicator.svelte @@ -0,0 +1,129 @@ + + +{#if label} +
+ + {#if expanded} + + {/if} +
+{/if} + + diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 1e9d8f4..979546e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -13,6 +13,8 @@ import SearchFilter from '$lib/components/SearchFilter.svelte'; import UpdateToast from '$lib/components/UpdateToast.svelte'; import Toast from '$lib/components/Toast.svelte'; + import SyncIndicator from '$lib/components/SyncIndicator.svelte'; + import { network } from '$lib/client/network.svelte'; import type { SearchHit } from '$lib/server/recipes/search-local'; import type { WebHit } from '$lib/server/search/searxng'; @@ -203,6 +205,7 @@ void wishlistStore.refresh(); void searchFilterStore.load(); void pwaStore.init(); + network.init(); document.addEventListener('click', handleClickOutside); document.addEventListener('keydown', handleKey); return () => { @@ -213,6 +216,7 @@ +