diff --git a/web/src/app.css b/web/src/app.css index f1b8456..1c2b5c9 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -501,14 +501,48 @@ } /* Loading spinner */ + .loading-container { + @apply pointer-events-none flex h-screen w-full items-center justify-center; + } + + .spinner { + @apply relative h-10 w-10; + } + .spinner-dot { - @apply bg-[var(--light-accent)]; + @apply absolute top-[37.5%] inline-block h-1/4 w-1/4 rounded-full bg-[var(--light-accent)]; + animation: sk-bouncedelay 1.4s infinite ease-in-out both; } .dark .spinner-dot { @apply bg-[var(--dark-accent)]; } + .spinner .bounce1 { + @apply left-0; + animation-delay: -0.32s; + } + + .spinner .bounce2 { + @apply left-[37.5%]; + animation-delay: -0.16s; + } + + .spinner .bounce3 { + @apply left-3/4; + } + + @keyframes sk-bouncedelay { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } + } + /* Main layout */ .main-layout-container { @apply flex h-screen bg-[var(--light-background)]; diff --git a/web/src/app.html b/web/src/app.html index 77a5ff5..15a2adf 100644 --- a/web/src/app.html +++ b/web/src/app.html @@ -5,6 +5,15 @@ %sveltekit.head% +
%sveltekit.body%
diff --git a/web/src/lib/components/LoadingSpinner.svelte b/web/src/lib/components/LoadingSpinner.svelte index c46916b..d13f582 100644 --- a/web/src/lib/components/LoadingSpinner.svelte +++ b/web/src/lib/components/LoadingSpinner.svelte @@ -1,51 +1,7 @@ - - -
-
-
-
+
+
+
+
+
+
- - diff --git a/web/src/lib/components/NoteView.svelte b/web/src/lib/components/NoteView.svelte index be13f08..f1edce7 100644 --- a/web/src/lib/components/NoteView.svelte +++ b/web/src/lib/components/NoteView.svelte @@ -17,18 +17,14 @@ import ToggleSidebar from "$lib/icons/ToggleSidebar.svelte" import VersionArrow from "$lib/icons/VersionArrow.svelte" - // Props - export let isLoading = false - // State + let isComponentReady = false let sidebarOpen = window.innerWidth > 768 let showSettings = false let showVersionsDropdown = false let isEditing = false onMount(async (): Promise => { - isLoading = true - try { // The following fetch attempts to refresh any expired tokens automatically await apiClient.getCurrentUser() @@ -44,8 +40,6 @@ } catch (error) { console.error(`error during auth: ${error}`) goto("/login") - } finally { - isLoading = false } // Default to sidebar closed on mobile @@ -60,6 +54,8 @@ // Keep listening to browser's resize events window.addEventListener("resize", handleResize) + isComponentReady = true + return () => { window.removeEventListener("resize", handleResize) } @@ -173,113 +169,115 @@ } -
- - {#if $cError} -
-
- {$cError} - +{#if isComponentReady} +
+ + {#if $cError} +
+
+ {$cError} + +
-
- {/if} + {/if} - - + + - -
- -
- + +
+ +
+ -
- {#if $currentFullNote} - - {#if isLatestVersion($currentFullNote)} - - {:else} - - {/if} - - -
- - - {#if showVersionsDropdown && $versionHistory && $versionHistory.length > 0} -
- {#each $versionHistory as version} - - {/each} -
+
+ {#if $currentFullNote} + + {#if isLatestVersion($currentFullNote)} + + {:else} + {/if} + + +
+ + + {#if showVersionsDropdown && $versionHistory && $versionHistory.length > 0} +
+ {#each $versionHistory as version} + + {/each} +
+ {/if} +
+ {/if} +
+ +
+ +
+
+ + +
+ {#if $currentFullNote} + + {:else} +
+

None selected

+
{/if} -
+ +
-
- -
- - - -
- {#if $currentFullNote} - - {:else} -
-

None selected

- -
- {/if} -
+ + {#if showSettings} + + {/if}
- - - {#if showSettings} - - {/if} -
+{/if} diff --git a/web/src/lib/components/ThemeToggle.svelte b/web/src/lib/components/ThemeToggle.svelte index 80542d4..1f8a773 100644 --- a/web/src/lib/components/ThemeToggle.svelte +++ b/web/src/lib/components/ThemeToggle.svelte @@ -10,25 +10,6 @@ }) - - - -