+
@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 @@
+
+