diff --git a/src/AliasVault.Client/Auth/Layout/MainLayout.razor b/src/AliasVault.Client/Auth/Layout/MainLayout.razor index 33f34e513..bc7e95f50 100644 --- a/src/AliasVault.Client/Auth/Layout/MainLayout.razor +++ b/src/AliasVault.Client/Auth/Layout/MainLayout.razor @@ -3,7 +3,7 @@
-
+
@Body
diff --git a/src/AliasVault.Client/Auth/Pages/Login.razor b/src/AliasVault.Client/Auth/Pages/Login.razor index fa52f7e7b..0a17fb846 100644 --- a/src/AliasVault.Client/Auth/Pages/Login.razor +++ b/src/AliasVault.Client/Auth/Pages/Login.razor @@ -173,7 +173,7 @@ else /// private async Task HandleLogin() { - _loadingIndicator.Show(); + _loadingIndicator.Show("Logging in..."); _serverValidationErrors.Clear(); try @@ -279,7 +279,7 @@ else /// private async Task HandleRecoveryCode() { - _loadingIndicator.Show(); + _loadingIndicator.Show("Verifying recovery code..."); _serverValidationErrors.Clear(); try @@ -337,7 +337,7 @@ else /// private async Task Handle2Fa() { - _loadingIndicator.Show(); + _loadingIndicator.Show("Verifying 2FA code..."); _serverValidationErrors.Clear(); try diff --git a/src/AliasVault.Client/Auth/Pages/Register.razor b/src/AliasVault.Client/Auth/Pages/Register.razor index 4033dda18..3b3c0ba99 100644 --- a/src/AliasVault.Client/Auth/Pages/Register.razor +++ b/src/AliasVault.Client/Auth/Pages/Register.razor @@ -53,7 +53,7 @@ private async Task HandleRegister() { - _loadingIndicator.Show(); + _loadingIndicator.Show("Creating account..."); _serverValidationErrors.Clear(); var (success, errorMessage) = await UserRegistrationService.RegisterUserAsync(_registerModel.Username, _registerModel.Password); diff --git a/src/AliasVault.Client/Auth/Pages/Unlock.razor b/src/AliasVault.Client/Auth/Pages/Unlock.razor index d56b7623c..7a89de539 100644 --- a/src/AliasVault.Client/Auth/Pages/Unlock.razor +++ b/src/AliasVault.Client/Auth/Pages/Unlock.razor @@ -114,7 +114,7 @@ else /// private async Task UnlockSubmit() { - _loadingIndicator.Show(); + _loadingIndicator.Show("Unlocking vault..."); _serverValidationErrors.Clear(); try diff --git a/src/AliasVault.Client/Main/Components/Loading/BoldLoadingIndicator.razor b/src/AliasVault.Client/Main/Components/Loading/BoldLoadingIndicator.razor index 9c42888ec..074ccd94e 100644 --- a/src/AliasVault.Client/Main/Components/Loading/BoldLoadingIndicator.razor +++ b/src/AliasVault.Client/Main/Components/Loading/BoldLoadingIndicator.razor @@ -1,4 +1,47 @@ - - - - +
+
+
+
+
+
+
+
+ + diff --git a/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor b/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor index 9a14f2e5e..d2a668f8c 100644 --- a/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor +++ b/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor @@ -1,25 +1,35 @@ @if (IsVisible) {
-
-
-
-
-
-
+
+
+
+
+
+
+
+ @if (!string.IsNullOrEmpty(LoadingMessage)) + { +
+ @LoadingMessage +
+ }
} @code { private bool IsVisible { get; set; } + private string LoadingMessage { get; set; } = string.Empty; /// /// Shows the loading indicator. /// - public void Show() + /// Optional message to display below the loading spinner. + public void Show(string? message = null) { IsVisible = true; + LoadingMessage = message ?? string.Empty; StateHasChanged(); } @@ -29,6 +39,77 @@ public void Hide() { IsVisible = false; + LoadingMessage = string.Empty; StateHasChanged(); } } + + diff --git a/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor.css b/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor.css deleted file mode 100644 index 6f18e266b..000000000 --- a/src/AliasVault.Client/Main/Components/Loading/FullScreenLoadingIndicator.razor.css +++ /dev/null @@ -1,73 +0,0 @@ -.loading { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - opacity: 0.9; -} - -.spinner { - position: absolute; - top: 50%; - left: 50%; - margin-top: -20px; - margin-left: -25px; - width: 50px; - height: 40px; - text-align: center; - font-size: 10px; -} - -.spinner>div { - z-index: 999; - height: 100%; - width: 6px; - display: inline-block; - -webkit-animation: sk-stretchdelay 1.2s infinite ease-in-out; - animation: sk-stretchdelay 1.2s infinite ease-in-out; -} - -.spinner .rect2 { - -webkit-animation-delay: -1.1s; - animation-delay: -1.1s; -} - -.spinner .rect3 { - -webkit-animation-delay: -1.0s; - animation-delay: -1.0s; -} - -.spinner .rect4 { - -webkit-animation-delay: -0.9s; - animation-delay: -0.9s; -} - -.spinner .rect5 { - -webkit-animation-delay: -0.8s; - animation-delay: -0.8s; -} - -@-webkit-keyframes sk-stretchdelay { - 0%, - 40%, - 100% { - -webkit-transform: scaleY(0.4) - } - 20% { - -webkit-transform: scaleY(1.0) - } -} - -@keyframes sk-stretchdelay { - 0%, - 40%, - 100% { - transform: scaleY(0.4); - -webkit-transform: scaleY(0.4); - } - 20% { - transform: scaleY(1.0); - -webkit-transform: scaleY(1.0); - } -} diff --git a/src/AliasVault.Client/Main/Components/Loading/LoadingIndicator.razor b/src/AliasVault.Client/Main/Components/Loading/LoadingIndicator.razor index 9628844fc..cb4197027 100644 --- a/src/AliasVault.Client/Main/Components/Loading/LoadingIndicator.razor +++ b/src/AliasVault.Client/Main/Components/Loading/LoadingIndicator.razor @@ -1,7 +1,49 @@
- - Loading... +
+
+
+
+
+
+
+
+ Loading...
+ + diff --git a/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor b/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor index 71b4d191f..bd4bdad6c 100644 --- a/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor +++ b/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor @@ -146,7 +146,7 @@ } IsCreating = true; - GlobalLoadingSpinner.Show(); + GlobalLoadingSpinner.Show("Creating new alias..."); StateHasChanged(); var credential = new Credential(); diff --git a/src/AliasVault.Client/Main/Layout/MainLayout.razor b/src/AliasVault.Client/Main/Layout/MainLayout.razor index a4517208e..2ecdafdec 100644 --- a/src/AliasVault.Client/Main/Layout/MainLayout.razor +++ b/src/AliasVault.Client/Main/Layout/MainLayout.razor @@ -48,13 +48,12 @@ { if (GlobalLoadingService.IsLoading) { - LoadingIndicator.Show(); + LoadingIndicator.Show(GlobalLoadingService.LoadingMessage); } else { LoadingIndicator.Hide(); } - StateHasChanged(); } } diff --git a/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor index 19a702b3c..3c517f5ad 100644 --- a/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor +++ b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor @@ -339,7 +339,7 @@ else /// private async Task SaveAlias() { - GlobalLoadingSpinner.Show(); + GlobalLoadingSpinner.Show("Saving vault..."); StateHasChanged(); if (EditMode) diff --git a/src/AliasVault.Client/Main/Pages/Credentials/Delete.razor b/src/AliasVault.Client/Main/Pages/Credentials/Delete.razor index c6d07d7dd..b7231e966 100644 --- a/src/AliasVault.Client/Main/Pages/Credentials/Delete.razor +++ b/src/AliasVault.Client/Main/Pages/Credentials/Delete.razor @@ -81,7 +81,7 @@ else return; } - GlobalLoadingSpinner.Show(); + GlobalLoadingSpinner.Show("Deleting credential..."); if (await CredentialService.SoftDeleteEntryAsync(Id)) { GlobalNotificationService.AddSuccessMessage("Credentials entry successfully deleted."); diff --git a/src/AliasVault.Client/Main/Pages/Settings/Security/ChangePassword.razor b/src/AliasVault.Client/Main/Pages/Settings/Security/ChangePassword.razor index 04589e8be..185462f5b 100644 --- a/src/AliasVault.Client/Main/Pages/Settings/Security/ChangePassword.razor +++ b/src/AliasVault.Client/Main/Pages/Settings/Security/ChangePassword.razor @@ -133,7 +133,7 @@ else /// private async Task InitiatePasswordChange() { - GlobalLoadingSpinner.Show(); + GlobalLoadingSpinner.Show("Changing password..."); GlobalNotificationService.ClearMessages(); StateHasChanged(); diff --git a/src/AliasVault.Client/Main/Pages/Settings/Security/DeleteAccount.razor b/src/AliasVault.Client/Main/Pages/Settings/Security/DeleteAccount.razor index 70d451dfa..afc768dbf 100644 --- a/src/AliasVault.Client/Main/Pages/Settings/Security/DeleteAccount.razor +++ b/src/AliasVault.Client/Main/Pages/Settings/Security/DeleteAccount.razor @@ -140,7 +140,7 @@ /// private async Task DeleteAccountConfirmed() { - GlobalLoadingSpinner.Show(); + GlobalLoadingSpinner.Show("Deleting account..."); GlobalNotificationService.ClearMessages(); try diff --git a/src/AliasVault.Client/Main/Pages/Welcome.razor b/src/AliasVault.Client/Main/Pages/Welcome.razor index 485678e50..3927fc817 100644 --- a/src/AliasVault.Client/Main/Pages/Welcome.razor +++ b/src/AliasVault.Client/Main/Pages/Welcome.razor @@ -181,7 +181,7 @@ private async Task FinishTutorial() { - GlobalLoadingSpinner.Show(); + GlobalLoadingSpinner.Show("Finishing tutorial..."); await DbService.Settings.SetTutorialDoneAsync(true); NavigationManager.NavigateTo("credentials"); GlobalLoadingSpinner.Hide(); diff --git a/src/AliasVault.Client/Services/GlobalLoadingService.cs b/src/AliasVault.Client/Services/GlobalLoadingService.cs index afc3c51c4..8c01dae79 100644 --- a/src/AliasVault.Client/Services/GlobalLoadingService.cs +++ b/src/AliasVault.Client/Services/GlobalLoadingService.cs @@ -13,6 +13,7 @@ namespace AliasVault.Client.Services; public sealed class GlobalLoadingService { private bool _isLoading; + private string _loadingMessage = string.Empty; /// /// Occurs when the loading state changes. @@ -35,13 +36,38 @@ public sealed class GlobalLoadingService } } + /// + /// Gets the current loading message. + /// + public string LoadingMessage + { + get => _loadingMessage; + private set + { + if (_loadingMessage != value) + { + _loadingMessage = value; + OnChange?.Invoke(); + } + } + } + /// /// Show the global loading spinner. /// - public void Show() => IsLoading = true; + /// Optional message to display below the loading spinner. + public void Show(string? message = null) + { + LoadingMessage = message ?? string.Empty; + IsLoading = true; + } /// /// Hide the global loading spinner. /// - public void Hide() => IsLoading = false; + public void Hide() + { + IsLoading = false; + LoadingMessage = string.Empty; + } } diff --git a/src/AliasVault.Client/wwwroot/css/tailwind.css b/src/AliasVault.Client/wwwroot/css/tailwind.css index 16d93475d..a187ff265 100644 --- a/src/AliasVault.Client/wwwroot/css/tailwind.css +++ b/src/AliasVault.Client/wwwroot/css/tailwind.css @@ -1600,6 +1600,11 @@ video { background-color: rgb(254 252 232 / var(--tw-bg-opacity)); } +.bg-amber-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity)); +} + .bg-opacity-50 { --tw-bg-opacity: 0.5; } @@ -2031,6 +2036,11 @@ video { color: rgb(133 77 14 / var(--tw-text-opacity)); } +.text-amber-700 { + --tw-text-opacity: 1; + color: rgb(180 83 9 / var(--tw-text-opacity)); +} + .opacity-0 { opacity: 0; } @@ -2744,6 +2754,11 @@ video { color: rgb(250 204 21 / var(--tw-text-opacity)); } +.dark\:text-amber-300:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(252 211 77 / var(--tw-text-opacity)); +} + .dark\:placeholder-gray-400:is(.dark *)::-moz-placeholder { --tw-placeholder-opacity: 1; color: rgb(156 163 175 / var(--tw-placeholder-opacity)); diff --git a/src/AliasVault.Client/wwwroot/index.template.html b/src/AliasVault.Client/wwwroot/index.template.html index ed4cb0abf..2dddd3ed3 100644 --- a/src/AliasVault.Client/wwwroot/index.template.html +++ b/src/AliasVault.Client/wwwroot/index.template.html @@ -41,10 +41,14 @@
- - - - +
+
+
+
+
+
+
+

AliasVault is loading

Initializing secure environment. AliasVault prioritizes your privacy by running entirely in your browser. The first load might take a short while. @@ -56,6 +60,45 @@

+ +