From 9f668009450945d02fba88defcaae8b6cc4b9c08 Mon Sep 17 00:00:00 2001 From: Till JS Date: Thu, 26 Mar 2026 12:58:36 +0100 Subject: [PATCH] feat(storage): replace loading spinners with skeleton shimmer screens Add FileSkeletonGrid and FileSkeletonList components that match the real card/row layout. Applied to files, folders, favorites, and trash pages with view-mode-aware skeleton selection. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/files/FileSkeletonGrid.svelte | 74 ++++++++++++++++ .../components/files/FileSkeletonList.svelte | 85 +++++++++++++++++++ .../web/src/routes/favorites/+page.svelte | 11 ++- .../apps/web/src/routes/files/+page.svelte | 11 ++- .../src/routes/files/[folderId]/+page.svelte | 11 ++- .../apps/web/src/routes/trash/+page.svelte | 6 +- 6 files changed, 182 insertions(+), 16 deletions(-) create mode 100644 apps/storage/apps/web/src/lib/components/files/FileSkeletonGrid.svelte create mode 100644 apps/storage/apps/web/src/lib/components/files/FileSkeletonList.svelte diff --git a/apps/storage/apps/web/src/lib/components/files/FileSkeletonGrid.svelte b/apps/storage/apps/web/src/lib/components/files/FileSkeletonGrid.svelte new file mode 100644 index 000000000..29b5158f1 --- /dev/null +++ b/apps/storage/apps/web/src/lib/components/files/FileSkeletonGrid.svelte @@ -0,0 +1,74 @@ + + +
+ {#each Array(count) as _, i} +
+
+
+
+
+ {/each} +
+ + diff --git a/apps/storage/apps/web/src/lib/components/files/FileSkeletonList.svelte b/apps/storage/apps/web/src/lib/components/files/FileSkeletonList.svelte new file mode 100644 index 000000000..c33781a60 --- /dev/null +++ b/apps/storage/apps/web/src/lib/components/files/FileSkeletonList.svelte @@ -0,0 +1,85 @@ + + +
+ {#each Array(count) as _, i} +
+
+
+
+
+
+ {/each} +
+ + diff --git a/apps/storage/apps/web/src/routes/favorites/+page.svelte b/apps/storage/apps/web/src/routes/favorites/+page.svelte index 80eeb446b..e8b06aa91 100644 --- a/apps/storage/apps/web/src/routes/favorites/+page.svelte +++ b/apps/storage/apps/web/src/routes/favorites/+page.svelte @@ -9,6 +9,8 @@ import FileGrid from '$lib/components/files/FileGrid.svelte'; import FileList from '$lib/components/files/FileList.svelte'; import FilePreviewModal from '$lib/components/files/FilePreviewModal.svelte'; + import FileSkeletonGrid from '$lib/components/files/FileSkeletonGrid.svelte'; + import FileSkeletonList from '$lib/components/files/FileSkeletonList.svelte'; let previewFile = $state(null); let files = $state([]); @@ -98,10 +100,11 @@ {#if loading} -
- -

Laden...

-
+ {#if filesStore.viewMode === 'grid'} + + {:else} + + {/if} {:else if error}

Fehler: {error}

diff --git a/apps/storage/apps/web/src/routes/files/+page.svelte b/apps/storage/apps/web/src/routes/files/+page.svelte index 80623f42f..e387e7407 100644 --- a/apps/storage/apps/web/src/routes/files/+page.svelte +++ b/apps/storage/apps/web/src/routes/files/+page.svelte @@ -11,6 +11,8 @@ import UploadZone from '$lib/components/files/UploadZone.svelte'; import NewFolderModal from '$lib/components/files/NewFolderModal.svelte'; import FilePreviewModal from '$lib/components/files/FilePreviewModal.svelte'; + import FileSkeletonGrid from '$lib/components/files/FileSkeletonGrid.svelte'; + import FileSkeletonList from '$lib/components/files/FileSkeletonList.svelte'; let previewFile = $state(null); let showUploadZone = $state(false); @@ -234,10 +236,11 @@ {/if} {#if filesStore.loading} -
- -

Laden...

-
+ {#if filesStore.viewMode === 'grid'} + + {:else} + + {/if} {:else if filesStore.error}

Fehler: {filesStore.error}

diff --git a/apps/storage/apps/web/src/routes/files/[folderId]/+page.svelte b/apps/storage/apps/web/src/routes/files/[folderId]/+page.svelte index 7f15e229f..76ace8bef 100644 --- a/apps/storage/apps/web/src/routes/files/[folderId]/+page.svelte +++ b/apps/storage/apps/web/src/routes/files/[folderId]/+page.svelte @@ -12,6 +12,8 @@ import UploadZone from '$lib/components/files/UploadZone.svelte'; import NewFolderModal from '$lib/components/files/NewFolderModal.svelte'; import FilePreviewModal from '$lib/components/files/FilePreviewModal.svelte'; + import FileSkeletonGrid from '$lib/components/files/FileSkeletonGrid.svelte'; + import FileSkeletonList from '$lib/components/files/FileSkeletonList.svelte'; let previewFile = $state(null); let showUploadZone = $state(false); @@ -250,10 +252,11 @@ {/if} {#if filesStore.loading} -
- -

Laden...

-
+ {#if filesStore.viewMode === 'grid'} + + {:else} + + {/if} {:else if filesStore.error}

Fehler: {filesStore.error}

diff --git a/apps/storage/apps/web/src/routes/trash/+page.svelte b/apps/storage/apps/web/src/routes/trash/+page.svelte index 74fde5986..c08bc6444 100644 --- a/apps/storage/apps/web/src/routes/trash/+page.svelte +++ b/apps/storage/apps/web/src/routes/trash/+page.svelte @@ -5,6 +5,7 @@ import { StorageEvents } from '@manacore/shared-utils/analytics'; import type { StorageFile, StorageFolder } from '$lib/api/client'; import { toastStore } from '@manacore/shared-ui'; + import FileSkeletonList from '$lib/components/files/FileSkeletonList.svelte'; let files = $state([]); let folders = $state([]); @@ -109,10 +110,7 @@
{#if loading} -
- -

Laden...

-
+ {:else if error}

Fehler: {error}