From b6158a89a6f16ad5f9e6545578f51458419f8e0b Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Tue, 9 Dec 2025 19:41:19 +0100 Subject: [PATCH] feat(ui): add comprehensive skeleton loaders for contacts and todo apps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add shared skeleton primitives to @manacore/shared-ui: - SkeletonAvatar, SkeletonCard, SkeletonRow, SkeletonList, SkeletonGrid - Add contacts app skeletons: - AppLoadingSkeleton for root layout auth loading - ContactListSkeleton, ContactGridSkeleton for contact views - ContactDetailSkeleton for modal loading - ContactNotesSkeleton for notes section - TagGridSkeleton, FavoriteGridSkeleton for respective pages - DuplicateListSkeleton for duplicates page - ImportPreviewSkeleton, GoogleImportSkeleton for import flows - NetworkGraphSkeleton for network visualization - Add todo app skeletons: - AppLoadingSkeleton for root layout - TaskListSkeleton with configurable sections - StatisticsSkeleton for stats page charts - KanbanBoardSkeleton, KanbanColumnSkeleton for kanban view - Replace all spinner loading indicators with skeleton loaders - All skeletons include proper accessibility attributes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../lib/components/ContactDetailModal.svelte | 21 +- .../web/src/lib/components/ContactList.svelte | 13 +- .../src/lib/components/ContactNotes.svelte | 5 +- .../lib/components/import/GoogleImport.svelte | 8 +- .../skeletons/AppLoadingSkeleton.svelte | 117 ++++++++ .../skeletons/ContactCardSkeleton.svelte | 70 +++++ .../skeletons/ContactDetailSkeleton.svelte | 171 ++++++++++++ .../skeletons/ContactGridSkeleton.svelte | 57 ++++ .../skeletons/ContactListSkeleton.svelte | 31 +++ .../skeletons/ContactNotesSkeleton.svelte | 40 +++ .../skeletons/ContactRowSkeleton.svelte | 45 ++++ .../skeletons/DuplicateGroupSkeleton.svelte | 89 +++++++ .../skeletons/DuplicateListSkeleton.svelte | 69 +++++ .../skeletons/FavoriteCardSkeleton.svelte | 62 +++++ .../skeletons/FavoriteGridSkeleton.svelte | 56 ++++ .../skeletons/GoogleImportSkeleton.svelte | 51 ++++ .../skeletons/ImportPreviewSkeleton.svelte | 118 ++++++++ .../skeletons/NetworkGraphSkeleton.svelte | 115 ++++++++ .../skeletons/TagCardSkeleton.svelte | 36 +++ .../skeletons/TagGridSkeleton.svelte | 50 ++++ .../web/src/lib/components/skeletons/index.ts | 42 +++ .../apps/web/src/routes/(app)/+layout.svelte | 12 +- .../web/src/routes/(app)/archive/+page.svelte | 5 +- .../web/src/routes/(app)/data/+page.svelte | 8 +- .../src/routes/(app)/duplicates/+page.svelte | 7 +- .../src/routes/(app)/favorites/+page.svelte | 11 +- .../web/src/routes/(app)/tags/+page.svelte | 5 +- .../apps/web/src/routes/+layout.svelte | 17 +- .../lib/components/kanban/KanbanBoard.svelte | 5 +- .../skeletons/AppLoadingSkeleton.svelte | 130 +++++++++ .../skeletons/KanbanBoardSkeleton.svelte | 70 +++++ .../skeletons/KanbanColumnSkeleton.svelte | 99 +++++++ .../skeletons/StatisticsSkeleton.svelte | 252 ++++++++++++++++++ .../skeletons/TaskItemSkeleton.svelte | 80 ++++++ .../skeletons/TaskListSkeleton.svelte | 73 +++++ .../web/src/lib/components/skeletons/index.ts | 20 ++ .../apps/web/src/routes/(app)/+page.svelte | 7 +- .../src/routes/(app)/statistics/+page.svelte | 31 +-- apps/todo/apps/web/src/routes/+layout.svelte | 10 +- packages/shared-ui/src/index.ts | 10 +- packages/shared-ui/src/molecules/index.ts | 10 +- .../molecules/loaders/SkeletonAvatar.svelte | 24 ++ .../src/molecules/loaders/SkeletonCard.svelte | 69 +++++ .../src/molecules/loaders/SkeletonGrid.svelte | 61 +++++ .../src/molecules/loaders/SkeletonList.svelte | 52 ++++ .../src/molecules/loaders/SkeletonRow.svelte | 60 +++++ .../shared-ui/src/molecules/loaders/index.ts | 20 ++ 47 files changed, 2303 insertions(+), 111 deletions(-) create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/AppLoadingSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ContactCardSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ContactDetailSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ContactGridSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ContactListSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ContactNotesSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ContactRowSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/DuplicateGroupSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/DuplicateListSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/FavoriteCardSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/FavoriteGridSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/GoogleImportSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/ImportPreviewSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/NetworkGraphSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/TagCardSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/TagGridSkeleton.svelte create mode 100644 apps/contacts/apps/web/src/lib/components/skeletons/index.ts create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/AppLoadingSkeleton.svelte create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/KanbanBoardSkeleton.svelte create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/KanbanColumnSkeleton.svelte create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/StatisticsSkeleton.svelte create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/TaskItemSkeleton.svelte create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/TaskListSkeleton.svelte create mode 100644 apps/todo/apps/web/src/lib/components/skeletons/index.ts create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonAvatar.svelte create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonCard.svelte create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonGrid.svelte create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonList.svelte create mode 100644 packages/shared-ui/src/molecules/loaders/SkeletonRow.svelte diff --git a/apps/contacts/apps/web/src/lib/components/ContactDetailModal.svelte b/apps/contacts/apps/web/src/lib/components/ContactDetailModal.svelte index f140824e4..004aa5bf6 100644 --- a/apps/contacts/apps/web/src/lib/components/ContactDetailModal.svelte +++ b/apps/contacts/apps/web/src/lib/components/ContactDetailModal.svelte @@ -3,6 +3,7 @@ import { onMount } from 'svelte'; import { contactsApi, photoApi, type Contact } from '$lib/api/contacts'; import ContactNotes from './ContactNotes.svelte'; + import { ContactDetailSkeleton } from '$lib/components/skeletons'; interface Props { contactId: string; @@ -276,25 +277,7 @@