UI: Additional improvements to the User Invitation flow (#6233)

* UI: Additional improvements to the User Invitation flow

Closes #6224.

* Clear invitation token only after the user can sign in

Fixes "404 Error on Follow-Up Visits" of #6236.

* Minor spacing fix

* Update accordion button
This commit is contained in:
d11n 2024-10-03 14:35:01 +02:00 committed by GitHub
parent 2f2b4094f6
commit 8c35edb6e8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 116 additions and 74 deletions

View file

@ -34,10 +34,8 @@ public class TruncateCenter : ViewComponent
};
if (!vm.IsVue)
{
vm.Start = vm.IsTruncated ? text[..padding] : text;
vm.Start = vm.IsTruncated && !vm.Elastic ? "{text[..padding]}…" : text;
vm.End = vm.IsTruncated ? text[^padding..] : string.Empty;
if (!vm.Elastic && vm.IsTruncated)
vm.Start = $"{vm.Start}…";
}
return View(vm);
}

View file

@ -706,6 +706,7 @@ namespace BTCPayServer.Controllers
Severity = StatusMessageModel.StatusSeverity.Success,
Message = "Your email has been confirmed."
});
await FinalizeInvitationIfApplicable(user);
return RedirectToAction(nameof(Login), new { email = user.Email });
}
@ -812,6 +813,7 @@ namespace BTCPayServer.Controllers
Severity = StatusMessageModel.StatusSeverity.Success,
Message = hasPassword ? "Password successfully set." : "Account successfully created."
});
if (!hasPassword) await FinalizeInvitationIfApplicable(user);
return RedirectToAction(nameof(Login));
}
@ -837,16 +839,6 @@ namespace BTCPayServer.Controllers
var requiresEmailConfirmation = user.RequiresEmailConfirmation && !user.EmailConfirmed;
var requiresSetPassword = !await _userManager.HasPasswordAsync(user);
_eventAggregator.Publish(new UserInviteAcceptedEvent
{
User = user,
RequestUri = Request.GetAbsoluteRootUri()
});
// unset used token
await _userManager.UnsetInvitationTokenAsync<ApplicationUser>(user.Id);
if (requiresEmailConfirmation)
{
return await RedirectToConfirmEmail(user);
@ -868,9 +860,22 @@ namespace BTCPayServer.Controllers
Message = "Your password has been set by the user who invited you."
});
await FinalizeInvitationIfApplicable(user);
return RedirectToAction(nameof(Login), new { email = user.Email });
}
private async Task FinalizeInvitationIfApplicable(ApplicationUser user)
{
if (!_userManager.HasInvitationToken<ApplicationUser>(user)) return;
_eventAggregator.Publish(new UserInviteAcceptedEvent
{
User = user,
RequestUri = Request.GetAbsoluteRootUri()
});
// unset used token
await _userManager.UnsetInvitationTokenAsync<ApplicationUser>(user.Id);
}
private async Task<IActionResult> RedirectToConfirmEmail(ApplicationUser user)
{
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

View file

@ -32,6 +32,12 @@ namespace BTCPayServer
return await userManager.SetInvitationTokenAsync<TUser>(userId, null);
}
public static bool HasInvitationToken<TUser>(this UserManager<ApplicationUser> userManager, ApplicationUser user, string? token = null) where TUser : class
{
var blob = user.GetBlob() ?? new UserBlob();
return token == null ? !string.IsNullOrEmpty(blob.InvitationToken) : blob.InvitationToken == token;
}
private static async Task<bool> SetInvitationTokenAsync<TUser>(this UserManager<ApplicationUser> userManager, string userId, string? token) where TUser : class
{
var user = await userManager.FindByIdAsync(userId);

View file

@ -8,11 +8,19 @@
<vc:icon symbol="close"/>
</button>
</div>
<div class="modal-body text-center">
<div class="text-center my-2" :style="{height: `${qrOptions.height}px`}">
<component v-if="currentFragment" :is="currentMode.href ? 'a': 'div'" class="qr-container d-inline-block" :href="currentMode.href">
<qrcode :value="currentFragment" :options="qrOptions"></qrcode>
</component>
<div class="modal-body pt-0">
<div class="payment-box m-0">
<div class="qr-container justify-content-start">
<component v-if="currentFragment" :is="currentMode.href ? 'a': 'div'" class="qr-container d-inline-block" :href="currentMode.href">
<qrcode :value="currentFragment" :options="qrOptions"></qrcode>
</component>
</div>
<div v-if="currentFragment" class="input-group mt-3">
<div class="form-floating">
<vc:truncate-center text="currentFragment" padding="15" elastic="true" is-vue="true" classes="form-control-plaintext"/>
<label>{{title}}</label>
</div>
</div>
</div>
<ul class="nav btcpay-pills justify-content-center mt-4 mb-3" v-if="modes && Object.keys(modes).length > 1">
<li class="nav-item" v-for="(item, key) in modes">
@ -107,8 +115,9 @@ function initQRShow(data) {
}
setTimeout(this.playNext, this.speed);
},
showData(data) {
this.modes = { default: { title: 'Default', fragments: [data] } };
showData(data, title) {
if (title) this.title = title;
this.modes = { default: { title: title || 'Default', fragments: [data] } };
this.mode = "default";
this.show();
},

View file

@ -1,4 +1,5 @@
@using BTCPayServer.Abstractions.Models
@inject BTCPayServer.Security.ContentSecurityPolicies Csp
@model UsersViewModel
@{
ViewData.SetActivePage(ServerNavPages.Users);
@ -9,10 +10,24 @@
"desc" => "asc",
_ => null
};
Csp.UnsafeEval();
const string sortByDesc = "Sort by email descending...";
const string sortByAsc = "Sort by email ascending...";
}
@section PageFootContent {
<script src="~/vendor/vuejs/vue.min.js" asp-append-version="true"></script>
<script src="~/vendor/vue-qrcode/vue-qrcode.min.js" asp-append-version="true"></script>
<script>
const qrApp = initQRShow({ title: "Invitation" });
delegate('click', '.view-invite', e => {
e.preventDefault();
const { invitationUrl, user } = e.target.dataset;
if (invitationUrl) qrApp.showData(invitationUrl, `Invitation for ${user}`);
});
</script>
}
<div class="sticky-header">
<h2 text-translate="true">@ViewData["Title"]</h2>
<a id="page-primary" asp-action="CreateUser" class="btn btn-primary" role="button">
@ -44,7 +59,7 @@
<th>Created</th>
<th>Status</th>
<th class="actions-col"></th>
<th></th>
<th class="w-75px"></th>
</tr>
</thead>
<tbody id="UsersList">
@ -58,7 +73,8 @@
{ InvitationUrl: not null } => ("Pending Invitation", "warning"),
_ => ("Active", "success")
};
var detailsId = $"user_details_{user.Id}";
var pendingInvite = !string.IsNullOrEmpty(user.InvitationUrl);
var detailsId = user.Stores.Any() ? $"user_details_{user.Id}" : null;
<tr id="user_@user.Id" class="user-overview-row mass-action-row">
<td>
<div class="d-flex align-items-center gap-2">
@ -72,73 +88,68 @@
<td class="@(user.Stores.Any() ? null : "text-muted")">@user.Stores.Count() Store@(user.Stores.Count() == 1 ? "" : "s")</td>
<td>@user.Created?.ToBrowserDate()</td>
<td>
<span class="user-status badge bg-@status.Item2">@status.Item1</span>
<span class="user-status badge bg-@status.Item2">@status.Item1</span>
</td>
<td class="actions-col">
<div class="d-inline-flex align-items-center gap-3">
@if (user is { EmailConfirmed: false, Disabled: false }) {
<a asp-action="SendVerificationEmail" asp-route-userId="@user.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-title="Send verification email" data-description="This will send a verification email to <strong>@Html.Encode(user.Email)</strong>." data-confirm="Send">Resend email</a>
<a asp-action="SendVerificationEmail" asp-route-userId="@user.Id" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-title="Send verification email" data-description="This will send a verification email to <strong>@Html.Encode(user.Email)</strong>." data-confirm="Send" class="text-nowrap">Resend email</a>
}
@if (user is { Approved: false, Disabled: false })
{
<a asp-action="ApproveUser" asp-route-userId="@user.Id" asp-route-approved="true" data-bs-toggle="modal" data-bs-target="#ConfirmModal" data-title="Approve user" data-description="This will approve the user <strong>@Html.Encode(user.Email)</strong>." data-confirm="Approve">Approve</a>
}
<a asp-action="User" asp-route-userId="@user.Id" class="user-edit">Edit</a>
@if (status.Item2 != "warning")
@if (pendingInvite)
{
<a asp-action="ToggleUser" asp-route-userId="@user.Id" asp-route-enable="@user.Disabled"
class="@(user.Disabled ? "enable-user" : "disable-user")">@(user.Disabled ? "Enable" : "Disable")</a>
<a asp-action="User" asp-route-userId="@user.Id" class="view-invite text-nowrap" data-invitation-url="@user.InvitationUrl" data-user="@user.Email">View Invite</a>
}
<a asp-action="ResetUserPassword" asp-route-userId="@user.Id" class="reset-password">Password Reset</a>
else if(status.Item2 != "warning")
{
<a asp-action="ToggleUser" asp-route-userId="@user.Id" asp-route-enable="@user.Disabled"
class="@(user.Disabled ? "enable-user" : "disable-user")">@(user.Disabled ? "Enable" : "Disable")</a>
}
<a asp-action="User" asp-route-userId="@user.Id" class="user-edit">Edit</a>
<a asp-action="ResetUserPassword" asp-route-userId="@user.Id" class="reset-password text-nowrap">Password Reset</a>
<a asp-action="DeleteUser" asp-route-userId="@user.Id" class="delete-user">Remove</a>
</div>
</td>
<td class="text-end">
<div class="d-inline-flex align-items-center gap-2">
<button class="accordion-button collapsed only-for-js ms-0 d-inline-block" type="button" data-bs-toggle="collapse" data-bs-target="#@detailsId" aria-expanded="false" aria-controls="@detailsId">
<vc:icon symbol="caret-down" />
@if (detailsId != null)
{
<button class="accordion-button w-auto collapsed only-for-js ms-0 d-inline-flex align-items-center gap-1" type="button" data-bs-toggle="collapse" data-bs-target="#@detailsId" aria-expanded="false" aria-controls="@detailsId">
<span>Details</span>
<vc:icon symbol="caret-down" css-class="ms-0" />
</button>
</div>
</td>
</tr>
<tr id="@detailsId" class="user-details-row collapse">
<td colspan="6" class="border-top-0">
@if (!string.IsNullOrEmpty(user.InvitationUrl))
{
<div class="payment-box m-0">
<div class="qr-container">
<vc:qr-code data="@user.InvitationUrl" />
</div>
<div class="input-group mt-3">
<div class="form-floating">
<vc:truncate-center text="@user.InvitationUrl" padding="15" elastic="true" classes="form-control-plaintext"/>
<label>Invitation URL</label>
</div>
</div>
</div>
}
else if (user.Stores.Any())
{
<ul class="mb-0 p-0">
@foreach (var store in user.Stores)
{
<li class="py-1 d-flex gap-2">
<a asp-controller="UIStores" asp-action="Index" asp-route-storeId="@store.StoreData.Id">@store.StoreData.StoreName</a>
<span class="badge bg-light">@store.StoreRoleId</span>
@if (store.StoreData.Archived)
{
<span class="badge bg-info">archived</span>
}
</li>
}
</ul>
}
else
{
<span class="text-secondary">No stores</span>
}
</td>
</tr>
@if (detailsId != null)
{
<tr id="@detailsId" class="user-details-row collapse">
<td colspan="6" class="border-top-0">
@if (user.Stores.Any())
{
<ul class="mb-0 p-0">
@foreach (var store in user.Stores)
{
<li class="py-1 d-flex gap-2">
<a asp-controller="UIStores" asp-action="Index" asp-route-storeId="@store.StoreData.Id">@store.StoreData.StoreName</a>
<span class="badge bg-light">@store.StoreRoleId</span>
@if (store.StoreData.Archived)
{
<span class="badge bg-info">archived</span>
}
</li>
}
</ul>
}
else
{
<span class="text-secondary">No stores</span>
}
</td>
</tr>
}
}
</tbody>
</table>
@ -147,3 +158,4 @@
<vc:pager view-model="Model"></vc:pager>
<partial name="_Confirm" model="@(new ConfirmModel("Send verification email", $"This will send a verification email to the user.", "Send"))" />
<partial name="ShowQR" />

View file

@ -24,7 +24,7 @@
@if (!string.IsNullOrEmpty(Model.InvitationUrl))
{
<div class="payment-box mx-0 mb-5">
<div class="payment-box mx-0 mb-4">
<div class="qr-container">
<vc:qr-code data="@Model.InvitationUrl" />
</div>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><clipPath id="actions-trash_clip0_8677_1443"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="api_clip0_8916_971"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-invoice-failure_clip"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-invoice-settled_clip"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-payout-approved_clip"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-payout_clip"><rect width="24" height="24" fill="white"/></clipPath></defs>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><clipPath id="actions-trash_clip0_8677_1443"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="api_clip0_8916_971"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="nav-products_clip0_2163_13240"><rect width="24" height="24" fill="currentColor"/></clipPath><clipPath id="notifications-invoice-failure_clip"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-invoice-settled_clip"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-payout-approved_clip"><rect width="24" height="24" fill="white"/></clipPath><clipPath id="notifications-payout_clip"><rect width="24" height="24" fill="white"/></clipPath></defs>
<symbol id="actions-add" viewBox="0 0 24 24" fill="none"><line x1="11.7084" y1="5.875" x2="11.7084" y2="18.125" stroke="currentColor" stroke-width="1.75" stroke-linecap="round"/><line x1="18.125" y1="11.7083" x2="5.875" y2="11.7083" stroke="currentColor" stroke-width="1.75" stroke-linecap="round"/></symbol>
<symbol id="actions-archive" viewBox="0 0 24 24" fill="none"><path d="M4.61536 7.38461C4.84258 7.38461 14.5562 7.38461 19.3846 7.38461" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M20 18.5V7.787C20 7.32766 19.8419 6.88232 19.5522 6.52582L17.9502 4.55411C17.6654 4.20355 17.2377 4 16.786 4H7.21396C6.76226 4 6.33462 4.20355 6.04978 4.55411L4.44777 6.52582C4.15811 6.88232 4 7.32766 4 7.787V18.5C4 19.3284 4.67157 20 5.5 20H18.5C19.3284 20 20 19.3284 20 18.5Z" stroke="currentColor" stroke-width="1.5"/><path d="M12 11V16M12 16L9.53845 13.5385M12 16L14.7692 13.5385" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
<symbol id="actions-comment" viewBox="0 0 24 24" fill="none"><path d="M20 15.625V5.875C20 5.04657 19.3284 4.375 18.5 4.375H12H5.5C4.67157 4.375 4 5.04657 4 5.875V15.625C4 16.4534 4.67157 17.125 5.5 17.125H9.5L12 19.625L14.5 17.125H18.5C19.3284 17.125 20 16.4534 20 15.625Z" stroke="currentColor" stroke-width="1.5"/><path d="M8.5 8.875H15.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M8.5 12.625H15.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
@ -74,11 +74,13 @@
<symbol id="nav-plugins-explore" viewBox="0 0 24 24" fill="none"><circle cx="11.75" cy="11.75" r="8.25" stroke="currentColor" stroke-width="1.5"/><path d="M10.3989 10.3096L13.7427 8.97203C14.1259 8.81873 14.5194 9.1696 14.4108 9.56783L13.3979 13.2815C13.3525 13.448 13.2245 13.5793 13.0592 13.6288L9.71436 14.6323C9.33296 14.7467 8.97735 14.3911 9.09177 14.0097L10.1057 10.6301C10.1494 10.4842 10.2574 10.3661 10.3989 10.3096Z" stroke="currentColor" stroke-width="1.5"/></symbol>
<symbol id="nav-plugins-manage" viewBox="0 0 24 24" fill="none"><path d="M6 7H18" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M6 12H18" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M6 17H14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
<symbol id="nav-pointofsale" viewBox="0 0 24 24" fill="none"><path d="M16.88 19.4303H7.12002C6.79748 19.4322 6.47817 19.3659 6.18309 19.2356C5.88802 19.1054 5.62385 18.9141 5.40795 18.6745C5.19206 18.4349 5.02933 18.1522 4.93046 17.8452C4.83159 17.5382 4.79882 17.2137 4.83431 16.8931L5.60002 10.1617C5.6311 9.88087 5.76509 9.62152 5.97615 9.43368C6.1872 9.24584 6.46035 9.14284 6.74288 9.14455H17.2572C17.5397 9.14284 17.8129 9.24584 18.0239 9.43368C18.235 9.62152 18.369 9.88087 18.4 10.1617L19.1429 16.8931C19.1782 17.2118 19.146 17.5343 19.0485 17.8398C18.951 18.1452 18.7903 18.4267 18.5769 18.666C18.3634 18.9053 18.1021 19.097 17.8097 19.2286C17.5174 19.3603 17.2006 19.429 16.88 19.4303Z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M7.42859 9.14369C7.42859 7.93128 7.91022 6.76852 8.76753 5.91121C9.62484 5.0539 10.7876 4.57227 12 4.57227C13.2124 4.57227 14.3752 5.0539 15.2325 5.91121C16.0898 6.76852 16.5714 7.93128 16.5714 9.14369" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.14282 12.5723H14.8571" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></symbol>
<symbol id="nav-products" viewBox="0 0 24 24" fill="none"><g clip-path="url(#clip0_2163_13240)"><path d="M12.3218 3.48287L3.42387 12.3808C3.2286 12.5761 3.2286 12.8927 3.42387 13.0879L11.1796 20.8437C11.3749 21.039 11.6915 21.039 11.8868 20.8437L20.7847 11.9458C20.8785 11.852 20.9312 11.7248 20.9312 11.5922V3.83643C20.9312 3.56028 20.7073 3.33643 20.4312 3.33643L12.6754 3.33643C12.5428 3.33643 12.4156 3.3891 12.3218 3.48287Z" stroke="currentColor" stroke-width="1.5"/><path d="M6.16748 9.64062L14.6304 18.1035" stroke="currentColor" stroke-width="1.5"/><circle cx="17" cy="7" r="1" fill="currentColor"/></g></symbol>
<symbol id="nav-pull-payments" viewBox="0 0 24 24" fill="none"><path d="M12 20a8 8 0 1 1 0-16 8 8 0 0 1 0 16Zm0-15.19a7.2 7.2 0 0 0 0 14.38A7.2 7.2 0 0 0 12 4.8Z" fill="currentColor" stroke="currentColor" stroke-width=".6"/><path d="M9.48 14.85a.44.44 0 0 1-.3-.14c-.14-.16-.14-.43.05-.57l5.02-4.31c.16-.14.43-.14.57.05.14.17.14.44-.05.57l-5.05 4.29c-.05.08-.16.1-.24.1Z" fill="currentColor" stroke="currentColor" stroke-width=".6"/><path d="M14.39 14.28a.4.4 0 0 1-.41-.4l.1-3.42-3.08-.17a.4.4 0 0 1-.38-.43c0-.22.19-.4.43-.38l3.47.19c.22 0 .38.19.38.4l-.13 3.83c.02.19-.17.38-.38.38Z" fill="currentColor" stroke="currentColor" stroke-width=".6"/></symbol>
<symbol id="nav-reporting" viewBox="0 0 24 24" fill="none"><path d="M12 19.7286C11.3561 18.4843 9.56974 17.0192 7.04638 16.7044C6.49834 16.636 6.04834 16.1951 6.04834 15.6429V5.51174C6.04834 4.88334 6.63109 4.30857 7.25812 4.35012C8.31264 4.42 9.90687 4.74919 12 6.40388" stroke="currentColor" stroke-width="1.5"/><path d="M5.90323 6.12335H5C3.89543 6.12335 3 7.01878 3 8.12335V17.5883C3 18.6929 3.89543 19.5883 5 19.5883H19C20.1046 19.5883 21 18.6929 21 17.5883V8.12335C21 7.01878 20.1046 6.12335 19 6.12335H12H11.5645" stroke="currentColor" stroke-width="1.5"/><path d="M14.9032 9.20908H18.0967" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M14.9032 12.9961H18.0967" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M14.9032 16.7831H18.0967" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><line x1="12.1693" y1="6.40387" x2="12.1693" y2="19.5883" stroke="currentColor" stroke-width="1.5"/></symbol>
<symbol id="nav-server-settings" viewBox="0 0 24 24" fill="none"><rect x="4.75" y="4.75" width="14.5" height="14.5" rx="3.25" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="m8 8 1.6 1.6L8 11.2" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/></symbol>
<symbol id="nav-store-settings" viewBox="0 0 24 24" fill="none"><path d="M9.81672 6.15385L10.3459 4.78769C10.4352 4.55639 10.5922 4.35743 10.7965 4.21688C11.0007 4.07632 11.2426 4.00073 11.4906 4H12.4998C12.7477 4.00073 12.9896 4.07632 13.1939 4.21688C13.3981 4.35743 13.5552 4.55639 13.6444 4.78769L14.1736 6.15385L15.9706 7.18769L17.4229 6.96615C17.6647 6.93333 17.9108 6.97314 18.13 7.08052C18.3491 7.1879 18.5314 7.35801 18.6536 7.56923L19.1459 8.43077C19.2721 8.64535 19.3302 8.89314 19.3126 9.14144C19.2951 9.38974 19.2026 9.62687 19.0475 9.82154L18.149 10.9662V13.0338L19.0721 14.1785C19.2272 14.3731 19.3197 14.6103 19.3373 14.8586C19.3548 15.1069 19.2967 15.3546 19.1706 15.5692L18.6783 16.4308C18.556 16.642 18.3737 16.8121 18.1546 16.9195C17.9354 17.0269 17.6893 17.0667 17.4475 17.0338L15.9952 16.8123L14.1983 17.8462L13.669 19.2123C13.5798 19.4436 13.4227 19.6426 13.2185 19.7831C13.0143 19.9237 12.7723 19.9993 12.5244 20H11.4906C11.2426 19.9993 11.0007 19.9237 10.7965 19.7831C10.5922 19.6426 10.4352 19.4436 10.3459 19.2123L9.81672 17.8462L8.01979 16.8123L6.56749 17.0338C6.32566 17.0667 6.07954 17.0269 5.86039 16.9195C5.64124 16.8121 5.45896 16.642 5.33672 16.4308L4.84441 15.5692C4.71826 15.3546 4.66013 15.1069 4.67771 14.8586C4.69529 14.6103 4.78774 14.3731 4.94287 14.1785L5.84133 13.0338V10.9662L4.91826 9.82154C4.76313 9.62687 4.67068 9.38974 4.6531 9.14144C4.63552 8.89314 4.69364 8.64535 4.81979 8.43077L5.3121 7.56923C5.43435 7.35801 5.61662 7.1879 5.83577 7.08052C6.05492 6.97314 6.30105 6.93333 6.54287 6.96615L7.99518 7.18769L9.81672 6.15385ZM9.53364 12C9.53364 12.4868 9.67801 12.9628 9.94848 13.3676C10.219 13.7724 10.6034 14.0879 11.0532 14.2742C11.503 14.4605 11.9979 14.5092 12.4754 14.4142C12.9529 14.3193 13.3915 14.0848 13.7357 13.7406C14.08 13.3963 14.3144 12.9577 14.4094 12.4802C14.5044 12.0027 14.4557 11.5078 14.2693 11.058C14.083 10.6082 13.7675 10.2238 13.3627 9.95331C12.9579 9.68283 12.482 9.53846 11.9952 9.53846C11.3423 9.53846 10.7162 9.7978 10.2546 10.2594C9.79298 10.7211 9.53364 11.3472 9.53364 12V12Z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></symbol>
<symbol id="nav-store" viewBox="0 0 24 24" fill="none"><path d="M19.0489 10.3147V16.5804C19.0489 17.8112 18.0419 18.8182 16.8112 18.8182H7.24472C6.01395 18.8182 5.00696 17.8112 5.00696 16.5804V10.3147" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10"/><path d="M9.4545 5.3077V9.13986C9.4545 10.3147 8.50345 11.2937 7.32862 11.2937H6.90904C5.00694 11.2937 3.7482 9.36364 4.50345 7.62937L5.06289 6.31469C5.34261 5.67133 5.95799 5.27972 6.62932 5.27972L9.4545 5.3077Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10"/><path d="M14.5454 5.30768V9.13985C14.5454 10.3147 15.4965 11.2937 16.6713 11.2937H17.0909C18.993 11.2937 20.2517 9.36362 19.4965 7.62936L18.937 6.31467C18.6573 5.69929 18.0419 5.30768 17.3706 5.30768H14.5454Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10"/><path d="M12 11.5455C10.6014 11.5455 9.48254 10.3986 9.48254 9.02797V5.33566H14.5455V9.02797C14.5455 10.4266 13.3986 11.5455 12 11.5455Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10"/><path d="M14 18.5V15.5C14 15.2239 13.7761 15 13.5 15H10.5C10.2239 15 10 15.2239 10 15.5V18.5" stroke="currentColor" stroke-width="1.5"/></symbol>
<symbol id="nav-transactions" viewBox="0 0 24 24" fill="none"><path d="M5.1457 7.42969L18.86 7.42969" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M5.1457 16.5703L18.86 16.5703" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M8.57428 13.1429L5.14571 16.5714L8.57428 20" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/><path d="M15.4314 10.8571L18.86 7.42857L15.4314 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></symbol>
<symbol id="notifications-account" viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="8.5" stroke="currentColor" stroke-width="1.5"/><circle cx="12" cy="11.25" r="3.5" stroke="currentColor" stroke-width="1.5"/><path d="M6.5 18.0289C7.55706 16.0762 9.62365 14.75 12 14.75C14.3763 14.75 16.4429 16.0762 17.5 18.0289" stroke="currentColor" stroke-width="1.5"/></symbol>
<symbol id="notifications-invoice-failure" viewBox="0 0 24 24" fill="none"><g clip-path="url(#clip)"><path fill-rule="evenodd" clip-rule="evenodd" d="M3.51481 20.4858C2.40048 19.3715 1.51654 18.0486 0.913469 16.5926C0.310397 15.1367 1.17414e-08 13.5762 0 12.0003C-1.17414e-08 10.4244 0.310397 8.86393 0.913469 7.40799C1.51654 5.95204 2.40048 4.62914 3.51481 3.51481C4.62914 2.40048 5.95204 1.51654 7.40799 0.913469C8.86393 0.310397 10.4244 -1.17414e-08 12.0003 0C13.5762 1.17414e-08 15.1367 0.310397 16.5926 0.913469C18.0486 1.51654 19.3715 2.40048 20.4858 3.51481C22.7363 5.7653 24.0006 8.81763 24.0006 12.0003C24.0006 15.183 22.7363 18.2353 20.4858 20.4858C18.2353 22.7363 15.183 24.0006 12.0003 24.0006C8.81763 24.0006 5.7653 22.7363 3.51481 20.4858ZM9.04531 7.45531C8.83205 7.25659 8.54998 7.1484 8.25852 7.15355C7.96707 7.15869 7.689 7.27676 7.48288 7.48288C7.27676 7.689 7.15869 7.96707 7.15355 8.25852C7.1484 8.54998 7.25659 8.83205 7.45531 9.04531L10.4103 12.0003L7.45531 14.9553C7.34478 15.0583 7.25613 15.1825 7.19464 15.3205C7.13315 15.4585 7.10009 15.6075 7.09742 15.7585C7.09476 15.9096 7.12254 16.0596 7.17912 16.1997C7.23571 16.3398 7.31992 16.467 7.42675 16.5739C7.53358 16.6807 7.66083 16.7649 7.80091 16.8215C7.94099 16.8781 8.09104 16.9059 8.24209 16.9032C8.39315 16.9005 8.54212 16.8675 8.68012 16.806C8.81812 16.7445 8.94232 16.6558 9.04531 16.5453L12.0003 13.5903L14.9553 16.5453C15.0583 16.6558 15.1825 16.7445 15.3205 16.806C15.4585 16.8675 15.6075 16.9005 15.7585 16.9032C15.9096 16.9059 16.0596 16.8781 16.1997 16.8215C16.3398 16.7649 16.467 16.6807 16.5739 16.5739C16.6807 16.467 16.7649 16.3398 16.8215 16.1997C16.8781 16.0596 16.9059 15.9096 16.9032 15.7585C16.9005 15.6075 16.8675 15.4585 16.806 15.3205C16.7445 15.1825 16.6558 15.0583 16.5453 14.9553L13.5903 12.0003L16.5453 9.04531C16.6558 8.94232 16.7445 8.81812 16.806 8.68012C16.8675 8.54212 16.9005 8.39315 16.9032 8.24209C16.9059 8.09104 16.8781 7.94099 16.8215 7.80091C16.7649 7.66083 16.6807 7.53358 16.5739 7.42675C16.467 7.31992 16.3398 7.23571 16.1997 7.17912C16.0596 7.12254 15.9096 7.09476 15.7585 7.09742C15.6075 7.10009 15.4585 7.13315 15.3205 7.19464C15.1825 7.25613 15.0583 7.34478 14.9553 7.45531L12.0003 10.4103L9.04531 7.45531Z" fill="#E11900"/></g></symbol>
<symbol id="notifications-invoice-settled" viewBox="0 0 24 24" fill="none"><g clip-path="url(#clip)"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 12C24 15.1826 22.7357 18.2348 20.4853 20.4853C18.2348 22.7357 15.1826 24 12 24C8.8174 24 5.76516 22.7357 3.51472 20.4853C1.26428 18.2348 0 15.1826 0 12C0 8.8174 1.26428 5.76516 3.51472 3.51472C5.76516 1.26428 8.8174 0 12 0C15.1826 0 18.2348 1.26428 20.4853 3.51472C22.7357 5.76516 24 8.8174 24 12ZM17.2215 9.38299C17.2267 9.67444 17.1185 9.95651 16.9198 10.1698L11.6698 15.4198C11.4588 15.6304 11.1729 15.7488 10.8748 15.7488C10.5766 15.7488 10.2907 15.6304 10.0798 15.4198L7.07977 12.4198C6.88105 12.2065 6.77286 11.9244 6.77801 11.633C6.78315 11.3415 6.90122 11.0635 7.10734 10.8573C7.31346 10.6512 7.59153 10.5331 7.88299 10.528C8.17444 10.5229 8.45651 10.631 8.66977 10.8298L10.8748 13.0348L15.3298 8.57977C15.543 8.38105 15.8251 8.27287 16.1166 8.27801C16.408 8.28315 16.6861 8.40122 16.8922 8.60734C17.0983 8.81346 17.2164 9.09153 17.2215 9.38299Z" fill="#51B13E"/></g></symbol>

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View file

@ -12267,10 +12267,20 @@ ul:not([class]) li {
.accordion-button .icon {
--icon-size: 1.5rem;
margin-top: -.0575em;
margin-bottom: -.0575em;
margin-left: auto;
transition: transform var(--btcpay-transition-duration-fast) ease-in-out;
}
.accordion-button span {
color: rgba(var(--btcpay-body-link-rgb), var(--btcpay-link-opacity, 1));
}
.accordion-button:hover span {
--btcpay-body-link-rgb: var(--btcpay-body-link-accent-rgb);
}
.accordion-button:not(.collapsed) .icon {
transform: rotate(-180deg);
}