From 4ecc52872074339d723d1a4b45cd1fc919420845 Mon Sep 17 00:00:00 2001 From: Ion Dormenco Date: Tue, 28 May 2024 11:43:38 +0300 Subject: [PATCH 1/4] Merge remote-tracking branch 'origin/feat/emails' --- .../Feature.Attachments/CreateV2/Endpoint.cs | 78 +++++++++++ .../Feature.Attachments/CreateV2/Request.cs | 19 +++ .../Feature.Attachments/CreateV2/Result.cs | 11 ++ .../Feature.Attachments/CreateV2/Validator.cs | 16 +++ .../Add/Endpoint.cs | 16 ++- .../Import/Endpoint.cs | 28 +++- .../ForgotPassword/Endpoint.cs | 2 +- .../Vote.Monitor.Api/DummyHealth/Endpoint.cs | 15 -- api/src/Vote.Monitor.Api/Program.cs | 2 +- .../EmailTemplates/confirm-email.html | 2 +- .../invitation-existing-user.html | Bin 4011 -> 5315 bytes .../EmailTemplates/invitation-new-user.html | Bin 3955 -> 5382 bytes .../EmailTemplates/reset-password.html | 2 +- .../Generators/ConfirmEmailGenerator.cs | 2 +- .../InvitationExistingUserEmailGenerator.cs | 4 +- .../InvitationNewUserEmailGenerator.cs | 7 +- .../Generators/ResetPasswordEmailGenerator.cs | 5 +- .../Props/InvitationExistingUserEmailProps.cs | 2 +- .../Props/InvitationNewUserEmailProps.cs | 4 +- .../Props/ResetPasswordEmailProps.cs | 2 +- .../Contracts/IFileStorageService.cs | 1 + .../Contracts/PresignedUploadLinkResult.cs | 9 ++ .../LocalDisk/LocalDiskFileStorageService.cs | 5 + .../FileStorage/S3/S3FileStorageService.cs | 28 +++- api/src/Vote.Monitor.Hangfire/Program.cs | 3 +- .../emails/components/Layout.tsx | 57 ++++++++ .../emails/confirm-email.tsx | 107 +++------------ .../emails/invitation-existing-user.tsx | 125 ++++------------- .../emails/invitation-new-user.tsx | 129 ++++-------------- .../emails/reset-password.tsx | 109 ++------------- .../emails/static/lincense.txt | 2 - .../emails/static/logo.png | Bin 28099 -> 16135 bytes .../out/confirm-email.html | 2 +- .../out/invitation-existing-user.html | Bin 4011 -> 5315 bytes .../out/invitation-new-user.html | Bin 3955 -> 5382 bytes .../out/reset-password.html | 2 +- .../out/static/lincense.txt | 2 - .../out/static/logo.png | Bin 28099 -> 16135 bytes 38 files changed, 372 insertions(+), 426 deletions(-) create mode 100644 api/src/Feature.Attachments/CreateV2/Endpoint.cs create mode 100644 api/src/Feature.Attachments/CreateV2/Request.cs create mode 100644 api/src/Feature.Attachments/CreateV2/Result.cs create mode 100644 api/src/Feature.Attachments/CreateV2/Validator.cs delete mode 100644 api/src/Vote.Monitor.Api/DummyHealth/Endpoint.cs create mode 100644 api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs create mode 100644 utils/email-templates-builder/emails/components/Layout.tsx delete mode 100644 utils/email-templates-builder/emails/static/lincense.txt delete mode 100644 utils/email-templates-builder/out/static/lincense.txt diff --git a/api/src/Feature.Attachments/CreateV2/Endpoint.cs b/api/src/Feature.Attachments/CreateV2/Endpoint.cs new file mode 100644 index 000000000..91be0bac6 --- /dev/null +++ b/api/src/Feature.Attachments/CreateV2/Endpoint.cs @@ -0,0 +1,78 @@ +using System.Net; +using Authorization.Policies.Requirements; +using Feature.Attachments.Specifications; +using Microsoft.AspNetCore.Authorization; +using Vote.Monitor.Core.Services.FileStorage.Contracts; +using Vote.Monitor.Domain.Entities.MonitoringObserverAggregate; + +namespace Feature.Attachments.CreateV2; + +public class Endpoint( + IAuthorizationService authorizationService, + IRepository repository, + IFileStorageService fileStorageService, + IReadRepository monitoringObserverRepository) + : Endpoint, NotFound, BadRequest, StatusCodeHttpResult>> +{ + public override void Configure() + { + Post("/api/election-rounds/{electionRoundId}/attachments:v2"); + DontAutoTag(); + Options(x => x.WithTags("attachments", "mobile")); + AllowFileUploads(); + Summary(s => + { + s.Summary = "Uploads an attachment for a specific polling station"; + }); + } + + public override async Task, NotFound, BadRequest, StatusCodeHttpResult>> ExecuteAsync(Request req, CancellationToken ct) + { + var authorizationResult = await authorizationService.AuthorizeAsync(User, new MonitoringObserverRequirement(req.ElectionRoundId)); + if (!authorizationResult.Succeeded) + { + return TypedResults.NotFound(); + } + var monitoringObserverSpecification = new GetMonitoringObserverSpecification(req.ElectionRoundId, req.ObserverId); + var monitoringObserver = await monitoringObserverRepository.FirstOrDefaultAsync(monitoringObserverSpecification, ct); + + if (monitoringObserver == null) + { + AddError(r => r.ObserverId, "Observer not found"); + return TypedResults.BadRequest(new ProblemDetails(ValidationFailures)); + } + + var uploadPath = $"elections/{req.ElectionRoundId}/polling-stations/{req.PollingStationId}/form/{req.FormId}/attachments"; + + var attachment = new AttachmentAggregate(req.Id, + req.ElectionRoundId, + req.PollingStationId, + monitoringObserver.Id, + req.FormId, + req.QuestionId, + req.FileName, + uploadPath, + req.ContentType); + + var getPresignedUploadUrlResult = await fileStorageService.GetPresignedUploadLinkAsync(uploadPath, fileName: attachment.UploadedFileName, ct); + + if (getPresignedUploadUrlResult is PresignedUploadLinkResult.Failed) + { + return TypedResults.StatusCode((int)HttpStatusCode.InternalServerError); + } + + await repository.AddAsync(attachment, ct); + + var result = getPresignedUploadUrlResult as PresignedUploadLinkResult.Ok; + + return TypedResults.Ok(new Result + { + Id = attachment.Id, + PresignedUrl = result!.Url, + UrlValidityInSeconds = result.UrlValidityInSeconds, + FormId = attachment.FormId, + PollingStationId = attachment.PollingStationId, + QuestionId = attachment.QuestionId, + }); + } +} diff --git a/api/src/Feature.Attachments/CreateV2/Request.cs b/api/src/Feature.Attachments/CreateV2/Request.cs new file mode 100644 index 000000000..727fb1362 --- /dev/null +++ b/api/src/Feature.Attachments/CreateV2/Request.cs @@ -0,0 +1,19 @@ +using Vote.Monitor.Core.Security; + +namespace Feature.Attachments.CreateV2; + +public class Request +{ + public Guid ElectionRoundId { get; set; } + + public Guid PollingStationId { get; set; } + + [FromClaim(ApplicationClaimTypes.UserId)] + public Guid ObserverId { get; set; } + + public Guid Id { get; set; } + public Guid FormId { get; set; } + public Guid QuestionId { get; set; } + public string FileName { get; set; } + public string ContentType { get; set; } +} diff --git a/api/src/Feature.Attachments/CreateV2/Result.cs b/api/src/Feature.Attachments/CreateV2/Result.cs new file mode 100644 index 000000000..f4277b2fb --- /dev/null +++ b/api/src/Feature.Attachments/CreateV2/Result.cs @@ -0,0 +1,11 @@ +namespace Feature.Attachments.CreateV2; + +public class Result +{ + public Guid Id { get; set; } + public string PresignedUrl { get; set; } + public int UrlValidityInSeconds { get; set; } + public Guid FormId { get; set; } + public Guid PollingStationId { get; set; } + public Guid QuestionId { get; set; } +} diff --git a/api/src/Feature.Attachments/CreateV2/Validator.cs b/api/src/Feature.Attachments/CreateV2/Validator.cs new file mode 100644 index 000000000..6f8afa163 --- /dev/null +++ b/api/src/Feature.Attachments/CreateV2/Validator.cs @@ -0,0 +1,16 @@ +using Vote.Monitor.Core.Validators; + +namespace Feature.Attachments.CreateV2; + +public class Validator : Validator +{ + public Validator() + { + RuleFor(x => x.ElectionRoundId).NotEmpty(); + RuleFor(x => x.PollingStationId).NotEmpty(); + RuleFor(x => x.ObserverId).NotEmpty(); + RuleFor(x => x.Id).NotEmpty(); + RuleFor(x => x.FormId).NotEmpty(); + RuleFor(x => x.QuestionId).NotEmpty(); + } +} diff --git a/api/src/Feature.MonitoringObservers/Add/Endpoint.cs b/api/src/Feature.MonitoringObservers/Add/Endpoint.cs index dd3d046df..1f0fb2277 100644 --- a/api/src/Feature.MonitoringObservers/Add/Endpoint.cs +++ b/api/src/Feature.MonitoringObservers/Add/Endpoint.cs @@ -1,7 +1,10 @@ using Authorization.Policies; using Feature.MonitoringObservers.Specifications; using Job.Contracts; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Options; using Vote.Monitor.Core.Extensions; +using Vote.Monitor.Core.Options; using Vote.Monitor.Core.Services.EmailTemplating; using Vote.Monitor.Core.Services.EmailTemplating.Props; using Vote.Monitor.Domain.Entities.ApplicationUserAggregate; @@ -18,9 +21,12 @@ public class Endpoint( IRepository repository, IRepository monitoringNgoRepository, IReadRepository observerRepository, - IRepository monitoringObserverRepository) + IRepository monitoringObserverRepository, + IOptions options) : Endpoint, NotFound, Conflict, ValidationProblem>> { + + private readonly ApiConfiguration _apiConfiguration = options.Value; public override void Configure() { Post("/api/election-rounds/{electionRoundId}/monitoring-ngos/{monitoringNgoId}/monitoring-observers"); @@ -83,8 +89,14 @@ public override async Task, NotFound, Conflictx.Ngo) + .Include(x => x.Ngo) .Where(x => x.NgoId == req.NgoId && x.ElectionRoundId == req.ElectionRoundId) .FirstAsync(ct); - + var ngoName = monitoringNgo.Ngo.Name; var electionRoundName = await context.ElectionRounds @@ -106,6 +106,8 @@ private async Task HandleParsingSucceedAsync(Request req, List x.NormalizedEmail == normalizedEmail); @@ -145,18 +147,26 @@ private async Task HandleParsingSucceedAsync(Request req, List.Fail failedResult, CancellationToken ct) { string csv = failedResult.Items.ConstructErrorFileContent(); diff --git a/api/src/Vote.Monitor.Api.Feature.Auth/ForgotPassword/Endpoint.cs b/api/src/Vote.Monitor.Api.Feature.Auth/ForgotPassword/Endpoint.cs index f2dd45e0c..ba04e03a2 100644 --- a/api/src/Vote.Monitor.Api.Feature.Auth/ForgotPassword/Endpoint.cs +++ b/api/src/Vote.Monitor.Api.Feature.Auth/ForgotPassword/Endpoint.cs @@ -39,7 +39,7 @@ public override async Task> ExecuteAsync(Request var endpointUri = new Uri(Path.Combine($"{_apiConfig.WebAppUrl}", "reset-password")); string passwordResetUrl = QueryHelpers.AddQueryString(endpointUri.ToString(), "token", code); - var emailProps = new ResetPasswordEmailProps(string.Empty, passwordResetUrl); + var emailProps = new ResetPasswordEmailProps(FullName: user.FirstName + " " + user.LastName, CdnUrl: _apiConfig.WebAppUrl, ResetPasswordUrl: passwordResetUrl); var mail = emailFactory.GenerateEmail(EmailTemplateType.ResetPassword, emailProps); jobService.SendEmail(request.Email, mail.Subject, mail.Body); diff --git a/api/src/Vote.Monitor.Api/DummyHealth/Endpoint.cs b/api/src/Vote.Monitor.Api/DummyHealth/Endpoint.cs deleted file mode 100644 index 9b03569f7..000000000 --- a/api/src/Vote.Monitor.Api/DummyHealth/Endpoint.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Vote.Monitor.Api.DummyHealth; - -public class Endpoint : EndpointWithoutRequest -{ - public override void Configure() - { - Get("/health"); - AllowAnonymous(); - } - - public override async Task HandleAsync(CancellationToken ct) - { - await SendAsync("healthy", cancellation: ct); - } -} diff --git a/api/src/Vote.Monitor.Api/Program.cs b/api/src/Vote.Monitor.Api/Program.cs index ebd88720b..d5c6f03e7 100644 --- a/api/src/Vote.Monitor.Api/Program.cs +++ b/api/src/Vote.Monitor.Api/Program.cs @@ -233,7 +233,7 @@ }); app.UseResponseCompression(); app.UseSentryMiddleware(); -app.MapHealthChecks("/healthz"); +app.MapHealthChecks("/health"); app.Run(); diff --git a/api/src/Vote.Monitor.Core/EmailTemplates/confirm-email.html b/api/src/Vote.Monitor.Core/EmailTemplates/confirm-email.html index c83df414b..449efc088 100644 --- a/api/src/Vote.Monitor.Core/EmailTemplates/confirm-email.html +++ b/api/src/Vote.Monitor.Core/EmailTemplates/confirm-email.html @@ -1 +1 @@ -
Confirm your email on VoteMonitor platform.
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏

Confirm your email on VoteMonitor platform.

Hello!

This is an automatic email that was sent to confirm your account.

Please follow👉 this link👈to complete your registration in order to use the application.

Thank you,
- Vote Monitor Team


Commit Global.

\ No newline at end of file +
Confirm your email on VoteMonitor platform
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏
\ No newline at end of file diff --git a/api/src/Vote.Monitor.Core/EmailTemplates/invitation-existing-user.html b/api/src/Vote.Monitor.Core/EmailTemplates/invitation-existing-user.html index 7073d914bb8fa719d1d5bb4bc1ce3c506d327169..11a5ed5b3b8cc31ae353c488d566c573840f2908 100644 GIT binary patch literal 5315 zcmeHL?{3>R5bvX~YBschC0S1DWd66NN&f+D7BtSfeJW^)mbg%&O3{wJqCviI-Cki| z_YC_mppTLl*emRg6dgNFiWTXX0YTANyd#gtyW`#O*t@;^-OljG{YNCzxgh(851&8V zA)X(Guhw_MaCf*%et0^3@tj0KlMEFtDz3RKs0hPHdmiyJt;eE$LoPqX*hft z&QMl_i|bEcFRcs`op^(u*)QR$?+L9uB50BJJysxx(PYrenWiL`g=U5Bdz#I3h)cR8 z&Zw%G?jH^x`&%C9txKQ1neb`f+p*LA;k;yCSj#AA&idZWr)4RapYV!~;5TPgMN{T0 zHkK-?&^{&vZe$#O+~vuiO_-artvD5K${tK72cU)HE^B0I+X%bJjucQrALa5V?xxyb zr@|+B2lIR+#p*({^+#g6BN`v23JbI!~xdfv={%*S z!7dcBgXba#p~(`qbn$@RN5JRCwfC1vpNb)e86yyZC&gHWALVwfK_?y($N;lH#}*}G zJ!1)kpXLKm-Iub6!+2xCW{XQ?4jWx|u`Upe;Q+iYRyxZe?b4`-nwyRF^+wd*GC|=? zW$nWAbSVlDu!HAR-1kn_;-olKV(lapGL=CIeS@>EJHbfE_^2x<8j-2RtTt%uH#ReV z!eXgRNLXU+nHH#veMpGT3AMsMRN7ot0RM|SY9;AiaD&Zf7l@zo&2p4l(`T&# zq#glzsCV1_Oc0t9lW~ zzpjQ)BpzC4jC?OOBQIpZHCPNS-d$JsXJfN#A&HPh3eDSMe^lRXl`wRB z!%WTT+$lr2CSxUY(xW7Uw}HNS;i%w=1KZCal`<79h-D6~s#GilkyV)3R`6S%^x*{r zxjEOVkRvLBDcCQ!<_lo*B30Ppbf?+gOvant%QAvTG`ujtLx=Zz1g|4U-r$MZ9gIxp zy^szFc;q8BQ6b!@)>27SF+?r=T8)q=?TyW?b~9T429p{-ct9C6#q#s?**2y901biq zT-R}n+j+I14JeGu*Sv*2}wwW}}n#^}TujfBE(N?%SIu7avbYzFd|kqo3sB zwYg %PxY2+DgV8E^0o$j$a5DBA$L&`GCz;Vookz|P=q5g=`Xnza0TV1oM;`D`s z6olO(J`l9`w6OGDa6y2+bC~%gGFmuF^gTC?M5=G%NMKGF(-(@^CxpEug0?Z*CMoIV zCo0282&WxQewer;zfUyf(fHW$%7e-p3GEPbpGMXa!l?i|#-2wb->NRfhp4)y#A-c0 zvcdeYGDhUL@tO5txiB`gE=~zO zB33nT*fn1f>IXtKVqR}dLqKfh6Um<=+oNW%+}~)vw?=hUjl4A2O?C9-v(oInnkuUx zCq__|t>zcKv}L8|X$n9Fy4)(wm4}7Pi^+pq!yJFqkv~RudjO^38N*I%YU?Ox$qHyoP$^ z=jrnNzw>5GwXq`JRL%3-(f~plj$~=@oia0q)DJLlBPEHNXP?E+maM5*#I74mB z7`p%U_1WN4am-kaD!g3qToe?M@5)!@ZmB#Rr;EwC8@l6ivtghYAPCxmhzj87Il-Z- zD9>jeF4`_|kMRD_=ylKEB+|^B7?-N@eM!@MVAkvFb&UIwjC6#hD5W(vAq=TNj~Td_ I$t<8 diff --git a/api/src/Vote.Monitor.Core/EmailTemplates/invitation-new-user.html b/api/src/Vote.Monitor.Core/EmailTemplates/invitation-new-user.html index 525c305517fb7c47d380905acda7df6218477725..dfd497d5feb79a66c5cdbd6af874017910a55571 100644 GIT binary patch literal 5382 zcmeHLU2fbq5YAC(#VrzGC9T%Z+TFj#vGWHct`V=1<|*JxT!}R$DirsxK@7jQX|K@N zo}mu~aui>nSLh5W?O$x8f%8(pFuW3n!{KOVIP(oV8wWq^_um{nCW%f3IXZdt;`u&t zT;G4aweR}}{R8sjv;NB$B=G8_uV_|q&1FV~?>|0th?8iYw|svxnRt^ePpa7Ozw)Oj zE5OC&tE-n*dXbKtUdQYgan*H%Rt^y~i@OfXaE8&S*GZYCB$SzEneIB8O|_3p+9XV< zDwyt`^q;u94(P3Om%SVDao5?m>~4RSGsiDwWHe=6XX?^C7tD=#K?m?mSy9lKxrz;? zN~zX7i*ZSzXM*(}rYz$0Udl6f!Xurun%nh!djGvwq;J!ii-Y$mRWZzKnYVDf!P8tS zO*7ptX9iMhnXXNKKoJwSx&7V>4w{Oki?wDtcN@4tPNN94YT;m=W9kO=ioq3Zs9O#1 z!HT4Ix!hGePClQu8-bX{s+g_ogse_l5rbtBnePnpX9NeCT+kEix&Yk~tR_yqg zB!F5y7)(US)EHQ!Mqa!UVkYKCxG6ien^0=(2hBO3#;|^)c#jG{r zZUK1Ag%ZVwHB!t9%~E&7YovramQo{+pgx|yq~WpQcmg776soTdamW-S{x1$<) zC1EpJ%|2sd%rp-vIbjWB@=7 zGUz%%z5b0uLP3k7>nzY7fmaL595Rq9Vt`xgz{i9*vM_BvK1TF`U>4?;6o5T*#R}Mk zB6e`9$U$hbge|LhK<^{qtH!1Gmr2*fP=y%-5P@Hcu?i1W?OK9P{74`J%>EKv)dWhY8(p7}z?(#xT5sH|Ik!9d9Hv@J&(k*US3HfZcSHZyL- zLa9thSYqj!2B?dDh>yd+W8dY!y7x5k9EdCv$p`V7f-g!HKyMR-trxRWfEL|O+_RzwiOrex$V`W7Yi+KU}3Yb)l zGk^oG1*}(dNZ%7k)6mutldW<62=vtn_z@}+R5e_9Q!BiIZZV}Z*rw1_Kpa@{WT<4i zFbZB#6mUy|9jq5i84KpY$3V9$74t!z!jEh>`8|)iaEXGmDc7-(11h|+gu*T}4%{9v z-^i#>&FvE=OAYmm>RHfHsEt^LcPy&la5Ny|i23C#dLwn@$ z?9*&U-i=s+aaGhHK53W`r~x+g2-OQqr*LziWs7G+`EbS6;QJey^HPZm!(Lrfl1mUm zd%0%WcXQhXS1hEEf=A>oqxgsQ>XM{f_jY&iPHM&6f!8p!Rf}I`-%o$eYe1vk*shWn kz)3tGDLe(3-CWs3HUO^vV81M?c&FI=7ehERKmY&$ delta 1085 zcma)5&rj4q6pj#0gkV_Q7)kswRsu>|3Ja`Dx6}lZRS!TSV#2}0bUSS)Oy|{hin|=( zX7q+m;?=W93B z_rH}Br$_f(T;B>3$hc?Jfk9$j^;@gz0~dymBg&eVf#aAFBW zRg#fTeyTEzlqA&GSQuY+e7!kM0WBy4O~>+0@IRjpQ@EzipLg^6?DUp{+^L`YMV50bK;*d})5 ztKoR>pK?@Xn~@L25pcpFm{U8FOq#og-195OHdmW&jW{GF6Aj>@BS- zNJD-oOfJO?H*-O@nd9`rYQ2WPK*`OK@<2P?RC?s+;^k}q+sC{!7j)ZAOvga?K@hY8 zoC-+LJ%S_KjOD4~O{eNY;*q5LWWCn
Reset your password on VoteMonitor Platform
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏

Reset your password on VoteMonitor Platform

Hello,

You are receiving this email because you requested help with your account credentials.

In order to reset your password please follow👉 this link👈and the instructions provided in the application.

If you don't want to change your password or didn't request this, just ignore and delete this message.

To keep your account secure, please don't forward this email to anyone.

Thank you,
- Vote Monitor Team


Commit Global.

\ No newline at end of file +
Reset your password on VoteMonitor Platform.
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏
\ No newline at end of file diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ConfirmEmailGenerator.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ConfirmEmailGenerator.cs index 8930af1e1..a91e7a1db 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ConfirmEmailGenerator.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ConfirmEmailGenerator.cs @@ -11,7 +11,7 @@ public EmailModel Generate(ConfirmEmailProps props) var body = template .Replace("~$cdnUrl$~", props.CdnUrl) - .Replace("~$email$~", props.Email) + .Replace("~$name$~", props.FullName) .Replace("~$confirmUrl$~", props.ConfirmUrl); return new EmailModel("Confirm your email on VoteMonitor platform", body); diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationExistingUserEmailGenerator.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationExistingUserEmailGenerator.cs index 97e2bfac4..0db946efb 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationExistingUserEmailGenerator.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationExistingUserEmailGenerator.cs @@ -10,11 +10,11 @@ public EmailModel Generate(InvitationExistingUserEmailProps props) var template = EmailTemplateLoader.GetTemplate(EmailTemplateType.InvitationExistingUser); var body = template + .Replace("~$name$~", props.FullName) .Replace("~$cdnUrl$~", props.CdnUrl) .Replace("~$ngoName$~", props.NgoName) .Replace("~$electionRoundDetails$~", props.ElectionRoundDetails); - return new EmailModel($"Accept invitation to monitor elections", body); - + return new EmailModel($"{props.NgoName} has invited you to be an observer for {props.ElectionRoundDetails}.", body); } } diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationNewUserEmailGenerator.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationNewUserEmailGenerator.cs index 15d9b2714..da1df0433 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationNewUserEmailGenerator.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/InvitationNewUserEmailGenerator.cs @@ -10,12 +10,13 @@ public EmailModel Generate(InvitationNewUserEmailProps props) var template = EmailTemplateLoader.GetTemplate(EmailTemplateType.InvitationNewUser); var body = template + .Replace("~$name$~", props.FullName) + .Replace("~$confirmUrl$~", props.AcceptUrl) .Replace("~$cdnUrl$~", props.CdnUrl) .Replace("~$ngoName$~", props.NgoName) - .Replace("~$electionRoundDetails$~", props.ElectionRoundDetails) - .Replace("~$inviteUrl$~", props.AcceptUrl); + .Replace("~$electionRoundDetails$~", props.ElectionRoundDetails); - return new EmailModel("Register on VoteMonitor platform to monitor elections", body); + return new EmailModel($"{props.NgoName} has invited you to be an observer for {props.ElectionRoundDetails}.", body); } } diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs index 1881417dc..51f817d9b 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs @@ -10,9 +10,10 @@ public EmailModel Generate(ResetPasswordEmailProps props) var template = EmailTemplateLoader.GetTemplate(EmailTemplateType.ResetPassword); var body = template + .Replace("~$name$~", props.FullName) + .Replace("~$resetPasswordUrl$~", props.ResetPasswordUrl) .Replace("~$cdnUrl$~", props.CdnUrl) - .Replace("~$resetPasswordUrl$~", props.ResetPasswordUrl); - return new EmailModel("Reset your password on VoteMonitor platform", body); + return new EmailModel("Reset your password on VoteMonitor Platform", body); } } diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationExistingUserEmailProps.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationExistingUserEmailProps.cs index 507d637c1..f7d93a096 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationExistingUserEmailProps.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationExistingUserEmailProps.cs @@ -1,3 +1,3 @@ namespace Vote.Monitor.Core.Services.EmailTemplating.Props; -public record InvitationExistingUserEmailProps(string CdnUrl, string NgoName, string ElectionRoundDetails) : BaseEmailProps(CdnUrl); +public record InvitationExistingUserEmailProps(string FullName, string CdnUrl, string NgoName, string ElectionRoundDetails) : BaseEmailProps(CdnUrl); diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationNewUserEmailProps.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationNewUserEmailProps.cs index a8e45b222..77a85c061 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationNewUserEmailProps.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/InvitationNewUserEmailProps.cs @@ -1,6 +1,8 @@ namespace Vote.Monitor.Core.Services.EmailTemplating.Props; -public record InvitationNewUserEmailProps(string CdnUrl, +public record InvitationNewUserEmailProps( + string FullName, + string CdnUrl, string AcceptUrl, string NgoName, string ElectionRoundDetails) : BaseEmailProps(CdnUrl); diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ResetPasswordEmailProps.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ResetPasswordEmailProps.cs index 70e953300..00c7ad635 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ResetPasswordEmailProps.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ResetPasswordEmailProps.cs @@ -1,3 +1,3 @@ namespace Vote.Monitor.Core.Services.EmailTemplating.Props; -public record ResetPasswordEmailProps(string CdnUrl, string ResetPasswordUrl) : BaseEmailProps(CdnUrl); +public record ResetPasswordEmailProps(string FullName, string CdnUrl, string ResetPasswordUrl) : BaseEmailProps(CdnUrl); diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs index 6463816a9..6c93b9a0a 100644 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs @@ -2,6 +2,7 @@ public interface IFileStorageService { + Task GetPresignedUploadLinkAsync(string uploadPath, string fileName, CancellationToken ct = default); Task UploadFileAsync(string uploadPath, string fileName, Stream stream, CancellationToken ct = default); Task GetPresignedUrlAsync(string uploadPath, string fileName, CancellationToken ct = default); } diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs new file mode 100644 index 000000000..e50bcfdb1 --- /dev/null +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs @@ -0,0 +1,9 @@ +namespace Vote.Monitor.Core.Services.FileStorage.Contracts; + +public abstract record PresignedUploadLinkResult +{ + public record Ok(string Url, int UrlValidityInSeconds) : PresignedUploadLinkResult; + public record Failed(string ErrorMessage) : PresignedUploadLinkResult; + + private PresignedUploadLinkResult() { } +} diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs index b57ec6e1a..b1ddfcc03 100644 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs @@ -16,6 +16,11 @@ public LocalDiskFileStorageService(IOptions options, ILogger GetPresignedUploadLinkAsync(string uploadPath, string fileName, CancellationToken ct = default) + { + return Task.FromResult(new PresignedUploadLinkResult.Ok(_options.Path, UrlValidityInSeconds)); + } + public async Task UploadFileAsync(string uploadPath, string filename, Stream stream, CancellationToken ct = default) { try diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs index 0ba59614f..834a57378 100644 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs @@ -1,4 +1,5 @@ -using Amazon.S3; +using System.IO; +using Amazon.S3; using Amazon.S3.Model; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -11,6 +12,31 @@ internal class S3FileStorageService(IAmazonS3 client, ILogger GetPresignedUploadLinkAsync(string uploadPath, string fileName, CancellationToken ct = default) + { + GetPreSignedUrlRequest request = new GetPreSignedUrlRequest + { + BucketName = _options.BucketName, + Key = GetFileKey(uploadPath, fileName), + Verb = HttpVerb.PUT, + Expires = DateTime.Now.AddSeconds(_options.PresignedUrlValidityInSeconds) + }; + + try + { + var urlString = await client.GetPreSignedURLAsync(request); + + return new PresignedUploadLinkResult.Ok(urlString, _options.PresignedUrlValidityInSeconds); + } + catch (AmazonS3Exception ex) + { + SentrySdk.CaptureException(ex); + logger.LogError(ex, "Failed to generate presigned Url in S3 for {uploadPath} {fileName}", uploadPath, fileName); + } + + return new PresignedUploadLinkResult.Failed("Failed to generate presigned Url"); + } + public async Task UploadFileAsync(string uploadPath, string fileName, Stream stream, CancellationToken ct = default) { var request = new PutObjectRequest diff --git a/api/src/Vote.Monitor.Hangfire/Program.cs b/api/src/Vote.Monitor.Hangfire/Program.cs index 2af38f439..0650df313 100644 --- a/api/src/Vote.Monitor.Hangfire/Program.cs +++ b/api/src/Vote.Monitor.Hangfire/Program.cs @@ -153,7 +153,6 @@ }); app.ScheduleRecurringJobs(); -app.MapHealthChecks("/healthz"); -app.MapGet("/health", () => "healthy"); +app.MapHealthChecks("/health"); app.Run(); diff --git a/utils/email-templates-builder/emails/components/Layout.tsx b/utils/email-templates-builder/emails/components/Layout.tsx new file mode 100644 index 000000000..b2b0c7bbb --- /dev/null +++ b/utils/email-templates-builder/emails/components/Layout.tsx @@ -0,0 +1,57 @@ +import { + Body, + Container, + Head, + Heading, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, + Tailwind, +} from "@react-email/components"; +import * as React from "react"; + + +interface LayoutProps { + name: string; + preview: string; + cdnUrl: string; + children: React.ReactNode; +} + +export const Layout = ({ name, preview, cdnUrl, children }: LayoutProps) => ( + + + + {preview} + + +
+ +
+ +
+ Hello, {name} + + {children} + + + Thank you. + + + If you have any questions, reach out to us at info@commitglobal.org. +
+ +
+ + + © {(new Date().getFullYear())} Commit Global. All rights reserved. + +
+ +
+ +); diff --git a/utils/email-templates-builder/emails/confirm-email.tsx b/utils/email-templates-builder/emails/confirm-email.tsx index e3f25896c..3162f00ee 100644 --- a/utils/email-templates-builder/emails/confirm-email.tsx +++ b/utils/email-templates-builder/emails/confirm-email.tsx @@ -1,104 +1,33 @@ -import { - Body, - Container, - Head, - Heading, - Hr, - Html, - Img, - Link, - Preview, - Section, - Text, -} from "@react-email/components"; +import { Heading, Link, Text } from "@react-email/components"; import * as React from "react"; +import { Layout } from "./components/Layout"; -interface NotionMagicLinkEmailProps { +interface ConfirmEmailProps { + name: string; cdnUrl: string; confirmUrl: string; } export const ConfirmEmail = ({ + name = '~$name$~', confirmUrl = '~$confirmUrl$~', cdnUrl = '~$cdnUrl$~' -}: NotionMagicLinkEmailProps) => ( - - - Confirm your email on VoteMonitor platform. - - - Confirm your email on VoteMonitor platform. -
- - Hello! - - - This is an automatic email that was sent to confirm your account. - - - Please follow - 👉 this link👈 - to complete your registration in order to use the application. - -
- - Thank you, -
- Vote Monitor Team -
-
- Commit Global. -
- - +}: ConfirmEmailProps) => ( + + + This is an automatic email that was sent to confirm your account. Please follow this link to complete your registration and to set your password in order to use the application. + + ); ConfirmEmail.PreviewProps = { confirmUrl: "https://example.com/", - cdnUrl: "", -} as NotionMagicLinkEmailProps; + name: "John Doe", + cdnUrl: "/static", +} as ConfirmEmailProps; export default ConfirmEmail; - -const main = { - backgroundColor: "#ffffff", - fontFamily: - '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', -}; - -const container = { - margin: "0 auto", - padding: "20px 25px 48px", - backgroundImage: 'url("/assets/raycast-bg.png")', - backgroundPosition: "bottom", - backgroundRepeat: "no-repeat, no-repeat", -}; - -const heading = { - fontSize: "28px", - fontWeight: "bold", - marginTop: "48px", -}; - -const body = { - margin: "24px 0", -}; - -const paragraph = { - fontSize: "16px", - lineHeight: "26px", -}; - -const link = { - color: "#FF6363", -}; - -const hr = { - borderColor: "#dddddd", - marginTop: "48px", -}; - -const footer = { - color: "#8898aa", - fontSize: "12px", - marginLeft: "4px", -}; \ No newline at end of file diff --git a/utils/email-templates-builder/emails/invitation-existing-user.tsx b/utils/email-templates-builder/emails/invitation-existing-user.tsx index b86752e98..91269cdee 100644 --- a/utils/email-templates-builder/emails/invitation-existing-user.tsx +++ b/utils/email-templates-builder/emails/invitation-existing-user.tsx @@ -1,117 +1,48 @@ -import { - Body, - Container, - Head, - Heading, - Hr, - Html, - Img, - Link, - Preview, - Section, - Text -} from "@react-email/components"; +import { Link, Text } from "@react-email/components"; import * as React from "react"; +import { Layout } from "./components/Layout"; interface ExistingUserInvitationEmailProps { + name: string; cdnUrl: string; ngoName: string; electionRoundDetails: string; } export const ExistingUserInvitationEmail = ({ + name = '~$name$~', cdnUrl = '~$cdnUrl$~', ngoName = '~$ngoName$~', - electionRoundDetails = '~$electionRoundDetails$~', + electionRoundDetails = '~$electionRoundDetails$~' }: ExistingUserInvitationEmailProps) => ( - - - {ngoName} has invited you to be an observer for {electionRoundDetails}. - - - {ngoName} has invited you to be an observer for {electionRoundDetails}. -
- - Hello, - - - Thank you for your service as an observer. We are glad to have you back. - - - {ngoName} has invited you to be an observer for {electionRoundDetails}. - - - Go to the Vote Monitor app and reactivate your account. Please make sure you have the latest version installed on your phone. - - - If you no longer have the app on your device, you may install it from: -
    -
  • Google play
  • -
  • Apple Store
  • -
-
- - Should you require additional support you may call +……………. - -
- - Thank you, -
- Vote Monitor Team -
-
- Commit Global. -
- - + + + Thank you for your service as an observer. We are glad to have you back. + + + + {ngoName} has invited you to be an observer for {electionRoundDetails}. + + + + Go to the Vote Monitor app and reactivate your account. Please make sure you have the latest version installed on your phone. + + + + If you no longer have the app on your device, you may install it from Google Play or Apple Store. + + ); ExistingUserInvitationEmail.PreviewProps = { - cdnUrl: "", + cdnUrl: "/static", + name: "John Doe", ngoName: "NGO name", electionRoundDetails: "Example election round 2024", } as ExistingUserInvitationEmailProps; export default ExistingUserInvitationEmail; - -const main = { - backgroundColor: "#ffffff", - fontFamily: - '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', -}; - -const container = { - margin: "0 auto", - padding: "20px 25px 48px", - backgroundPosition: "bottom", - backgroundRepeat: "no-repeat, no-repeat", -}; - -const heading = { - fontSize: "28px", - fontWeight: "bold", - marginTop: "48px", -}; - -const body = { - margin: "24px 0", -}; - -const paragraph = { - fontSize: "16px", - lineHeight: "26px", -}; - -const link = { - color: "#FF6363", -}; - -const hr = { - borderColor: "#dddddd", - marginTop: "48px", -}; - -const footer = { - color: "#8898aa", - fontSize: "12px", - marginLeft: "4px", -}; \ No newline at end of file diff --git a/utils/email-templates-builder/emails/invitation-new-user.tsx b/utils/email-templates-builder/emails/invitation-new-user.tsx index f9c6b1c7b..e815b3d1b 100644 --- a/utils/email-templates-builder/emails/invitation-new-user.tsx +++ b/utils/email-templates-builder/emails/invitation-new-user.tsx @@ -1,119 +1,50 @@ -import { - Body, - Container, - Head, - Heading, - Hr, - Html, - Img, - Link, - Preview, - Section, - Text -} from "@react-email/components"; +import { Link, Text } from "@react-email/components"; import * as React from "react"; +import { Layout } from "./components/Layout"; interface NewUserInvitationEmailProps { - inviteUrl: string; + name: string; + confirmUrl: string; cdnUrl: string; ngoName: string; electionRoundDetails: string; } export const NewUserInvitationEmail = ({ - inviteUrl = '~$inviteUrl$~', + name = '~$name$~', + confirmUrl = '~$confirmUrl$~', cdnUrl = '~$cdnUrl$~', ngoName = '~$ngoName$~', - electionRoundDetails = '~$electionRoundDetails$~', + electionRoundDetails = '~$electionRoundDetails$~' }: NewUserInvitationEmailProps) => ( - - - {ngoName} has invited you to be an observer for {electionRoundDetails}. - - - {ngoName} has invited you to be an observer for {electionRoundDetails}. -
- - Hello, - - - Thank you for your decision to be an independent observer! We are very glad and grateful to have you here. - - - {ngoName} has invited you to be an observer for {electionRoundDetails}. - - - Please follow - 👉 this link👈 - to complete your registration and to set your password in order to use the application. - - - You can install the app from: -
    -
  • Google play
  • -
  • Apple Store
  • -
-
-
- - Thank you, -
- Vote Monitor Team -
-
- Commit Global. -
- - + + + Thank you for your decision to be an independent observer! We are very glad and grateful to have you here. + + + + {ngoName} has invited you to be an observer for {electionRoundDetails}. + + + + Please follow this link to complete your registration and to set your password in order to use the application. + + + + You may install the app from Google Play or Apple Store. + + ); NewUserInvitationEmail.PreviewProps = { - inviteUrl: "https://example.com/", - cdnUrl: "", + cdnUrl: "/static", + name: "John Doe", ngoName: "NGO name", electionRoundDetails: "Example election round 2024", } as NewUserInvitationEmailProps; export default NewUserInvitationEmail; - -const main = { - backgroundColor: "#ffffff", - fontFamily: - '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', -}; - -const container = { - margin: "0 auto", - padding: "20px 25px 48px", - backgroundPosition: "bottom", - backgroundRepeat: "no-repeat, no-repeat", -}; - -const heading = { - fontSize: "28px", - fontWeight: "bold", - marginTop: "48px", -}; - -const body = { - margin: "24px 0", -}; - -const paragraph = { - fontSize: "16px", - lineHeight: "26px", -}; - -const link = { - color: "#FF6363", -}; - -const hr = { - borderColor: "#dddddd", - marginTop: "48px", -}; - -const footer = { - color: "#8898aa", - fontSize: "12px", - marginLeft: "4px", -}; \ No newline at end of file diff --git a/utils/email-templates-builder/emails/reset-password.tsx b/utils/email-templates-builder/emails/reset-password.tsx index 840091aaf..61658507a 100644 --- a/utils/email-templates-builder/emails/reset-password.tsx +++ b/utils/email-templates-builder/emails/reset-password.tsx @@ -1,112 +1,33 @@ -import { - Body, - Container, - Head, - Heading, - Hr, - Html, - Img, - Link, - Preview, - Section, - Text -} from "@react-email/components"; +import { Link, Text } from "@react-email/components"; import * as React from "react"; +import { Layout } from "./components/Layout"; interface ResetPasswordEmailProps { + name: string; resetPasswordUrl: string; cdnUrl: string; } export const ResetPasswordEmail = ({ + name = '~$name$~', resetPasswordUrl = '~$resetPasswordUrl$~', cdnUrl = '~$cdnUrl$~' }: ResetPasswordEmailProps) => ( - - - Reset your password on VoteMonitor Platform - - - Reset your password on VoteMonitor Platform -
- - Hello, - - - You are receiving this email because you requested help with your account credentials. - - - In order to reset your password please follow - 👉 this link👈 - and the instructions provided in the application. - - - If you don't want to change your password or didn't - request this, just ignore and delete this message. - - - To keep your account secure, please don't forward this email - to anyone. - -
- - Thank you, -
- Vote Monitor Team -
-
- Commit Global. -
- - + + + You are receiving this email because you requested help with your account credentials. In order to reset your password please follow this link and the instructions provided in the application. + + ); ResetPasswordEmail.PreviewProps = { resetPasswordUrl: "https://example.com/", - cdnUrl: "" + cdnUrl: "/static", + name: "John Doe" } as ResetPasswordEmailProps; export default ResetPasswordEmail; - -const main = { - backgroundColor: "#ffffff", - fontFamily: - '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif', -}; - -const container = { - margin: "0 auto", - padding: "20px 25px 48px", - backgroundImage: 'url("/assets/raycast-bg.png")', - backgroundPosition: "bottom", - backgroundRepeat: "no-repeat, no-repeat", -}; - -const heading = { - fontSize: "28px", - fontWeight: "bold", - marginTop: "48px", -}; - -const body = { - margin: "24px 0", -}; - -const paragraph = { - fontSize: "16px", - lineHeight: "26px", -}; - -const link = { - color: "#FF6363", -}; - -const hr = { - borderColor: "#dddddd", - marginTop: "48px", -}; - -const footer = { - color: "#8898aa", - fontSize: "12px", - marginLeft: "4px", -}; \ No newline at end of file diff --git a/utils/email-templates-builder/emails/static/lincense.txt b/utils/email-templates-builder/emails/static/lincense.txt deleted file mode 100644 index 4739bd6ec..000000000 --- a/utils/email-templates-builder/emails/static/lincense.txt +++ /dev/null @@ -1,2 +0,0 @@ -Icon by Freepik -https://www.freepik.com/icon/paw_5720964#fromView=search&page=1&position=9&uuid=4e94ffb7-bd6b-4e2e-a331-4472f2f53475 \ No newline at end of file diff --git a/utils/email-templates-builder/emails/static/logo.png b/utils/email-templates-builder/emails/static/logo.png index 0bf3fbd5fac9d26ba0c4748a43d70459e653e4ee..fb1337c70e1ed59ae6b2b54cb940fe6dc941e7a9 100644 GIT binary patch literal 16135 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 NQdCZ)O2{Da{{iv6F3tb| literal 28099 zcmX6_1yq#J*M67o?v|Dkq#G$gN~I+QY3T(-5SEZG0RdqN7o??sbf*d|EZr$A9fEXx zum6v8IKa!!+&g#f+<2bZjef5Cl$d~l0001DO%2tT0DuAhiUHu^fIm*(Obu)R{a$<70e*gdLQZZj-nOqj z?1bFC9I_7N7yy6`&{Tb5@D9GW=m)3TxWzph5fyDQK6~Ghf4=ktOYM`Ts?<+)rDPKX zcYW?<-$m?0oOr?LewKI!@fX#37!-^#HtuYOr5F?sBo0u3Q-Z*iCW}#aym g?sS0(7>2R|4f>j|^5)PESu6sx_k- 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%0A#SJ~nCGqhG386Te>{WImKrk~ZL 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 AO8@`> diff --git a/utils/email-templates-builder/out/confirm-email.html b/utils/email-templates-builder/out/confirm-email.html index c83df414b..449efc088 100644 --- a/utils/email-templates-builder/out/confirm-email.html +++ b/utils/email-templates-builder/out/confirm-email.html @@ -1 +1 @@ -
Confirm your email on VoteMonitor platform.
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏

Confirm your email on VoteMonitor platform.

Hello!

This is an automatic email that was sent to confirm your account.

Please follow👉 this link👈to complete your registration in order to use the application.

Thank you,
- Vote Monitor Team


Commit Global.

\ No newline at end of file +
Confirm your email on VoteMonitor platform
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏
\ No newline at end of file diff --git a/utils/email-templates-builder/out/invitation-existing-user.html b/utils/email-templates-builder/out/invitation-existing-user.html index 7073d914bb8fa719d1d5bb4bc1ce3c506d327169..11a5ed5b3b8cc31ae353c488d566c573840f2908 100644 GIT binary patch literal 5315 zcmeHL?{3>R5bvX~YBschC0S1DWd66NN&f+D7BtSfeJW^)mbg%&O3{wJqCviI-Cki| z_YC_mppTLl*emRg6dgNFiWTXX0YTANyd#gtyW`#O*t@;^-OljG{YNCzxgh(851&8V zA)X(Guhw_MaCf*%et0^3@tj0KlMEFtDz3RKs0hPHdmiyJt;eE$LoPqX*hft z&QMl_i|bEcFRcs`op^(u*)QR$?+L9uB50BJJysxx(PYrenWiL`g=U5Bdz#I3h)cR8 z&Zw%G?jH^x`&%C9txKQ1neb`f+p*LA;k;yCSj#AA&idZWr)4RapYV!~;5TPgMN{T0 zHkK-?&^{&vZe$#O+~vuiO_-artvD5K${tK72cU)HE^B0I+X%bJjucQrALa5V?xxyb zr@|+B2lIR+#p*({^+#g6BN`v23JbI!~xdfv={%*S z!7dcBgXba#p~(`qbn$@RN5JRCwfC1vpNb)e86yyZC&gHWALVwfK_?y($N;lH#}*}G zJ!1)kpXLKm-Iub6!+2xCW{XQ?4jWx|u`Upe;Q+iYRyxZe?b4`-nwyRF^+wd*GC|=? zW$nWAbSVlDu!HAR-1kn_;-olKV(lapGL=CIeS@>EJHbfE_^2x<8j-2RtTt%uH#ReV z!eXgRNLXU+nHH#veMpGT3AMsMRN7ot0RM|SY9;AiaD&Zf7l@zo&2p4l(`T&# zq#glzsCV1_Oc0t9lW~ zzpjQ)BpzC4jC?OOBQIpZHCPNS-d$JsXJfN#A&HPh3eDSMe^lRXl`wRB z!%WTT+$lr2CSxUY(xW7Uw}HNS;i%w=1KZCal`<79h-D6~s#GilkyV)3R`6S%^x*{r zxjEOVkRvLBDcCQ!<_lo*B30Ppbf?+gOvant%QAvTG`ujtLx=Zz1g|4U-r$MZ9gIxp zy^szFc;q8BQ6b!@)>27SF+?r=T8)q=?TyW?b~9T429p{-ct9C6#q#s?**2y901biq zT-R}n+j+I14JeGu*Sv*2}wwW}}n#^}TujfBE(N?%SIu7avbYzFd|kqo3sB zwYg %PxY2+DgV8E^0o$j$a5DBA$L&`GCz;Vookz|P=q5g=`Xnza0TV1oM;`D`s z6olO(J`l9`w6OGDa6y2+bC~%gGFmuF^gTC?M5=G%NMKGF(-(@^CxpEug0?Z*CMoIV zCo0282&WxQewer;zfUyf(fHW$%7e-p3GEPbpGMXa!l?i|#-2wb->NRfhp4)y#A-c0 zvcdeYGDhUL@tO5txiB`gE=~zO zB33nT*fn1f>IXtKVqR}dLqKfh6Um<=+oNW%+}~)vw?=hUjl4A2O?C9-v(oInnkuUx zCq__|t>zcKv}L8|X$n9Fy4)(wm4}7Pi^+pq!yJFqkv~RudjO^38N*I%YU?Ox$qHyoP$^ z=jrnNzw>5GwXq`JRL%3-(f~plj$~=@oia0q)DJLlBPEHNXP?E+maM5*#I74mB z7`p%U_1WN4am-kaD!g3qToe?M@5)!@ZmB#Rr;EwC8@l6ivtghYAPCxmhzj87Il-Z- zD9>jeF4`_|kMRD_=ylKEB+|^B7?-N@eM!@MVAkvFb&UIwjC6#hD5W(vAq=TNj~Td_ I$t<8 diff --git a/utils/email-templates-builder/out/invitation-new-user.html b/utils/email-templates-builder/out/invitation-new-user.html index 525c305517fb7c47d380905acda7df6218477725..dfd497d5feb79a66c5cdbd6af874017910a55571 100644 GIT binary patch literal 5382 zcmeHLU2fbq5YAC(#VrzGC9T%Z+TFj#vGWHct`V=1<|*JxT!}R$DirsxK@7jQX|K@N zo}mu~aui>nSLh5W?O$x8f%8(pFuW3n!{KOVIP(oV8wWq^_um{nCW%f3IXZdt;`u&t zT;G4aweR}}{R8sjv;NB$B=G8_uV_|q&1FV~?>|0th?8iYw|svxnRt^ePpa7Ozw)Oj zE5OC&tE-n*dXbKtUdQYgan*H%Rt^y~i@OfXaE8&S*GZYCB$SzEneIB8O|_3p+9XV< zDwyt`^q;u94(P3Om%SVDao5?m>~4RSGsiDwWHe=6XX?^C7tD=#K?m?mSy9lKxrz;? zN~zX7i*ZSzXM*(}rYz$0Udl6f!Xurun%nh!djGvwq;J!ii-Y$mRWZzKnYVDf!P8tS zO*7ptX9iMhnXXNKKoJwSx&7V>4w{Oki?wDtcN@4tPNN94YT;m=W9kO=ioq3Zs9O#1 z!HT4Ix!hGePClQu8-bX{s+g_ogse_l5rbtBnePnpX9NeCT+kEix&Yk~tR_yqg zB!F5y7)(US)EHQ!Mqa!UVkYKCxG6ien^0=(2hBO3#;|^)c#jG{r zZUK1Ag%ZVwHB!t9%~E&7YovramQo{+pgx|yq~WpQcmg776soTdamW-S{x1$<) zC1EpJ%|2sd%rp-vIbjWB@=7 zGUz%%z5b0uLP3k7>nzY7fmaL595Rq9Vt`xgz{i9*vM_BvK1TF`U>4?;6o5T*#R}Mk zB6e`9$U$hbge|LhK<^{qtH!1Gmr2*fP=y%-5P@Hcu?i1W?OK9P{74`J%>EKv)dWhY8(p7}z?(#xT5sH|Ik!9d9Hv@J&(k*US3HfZcSHZyL- zLa9thSYqj!2B?dDh>yd+W8dY!y7x5k9EdCv$p`V7f-g!HKyMR-trxRWfEL|O+_RzwiOrex$V`W7Yi+KU}3Yb)l zGk^oG1*}(dNZ%7k)6mutldW<62=vtn_z@}+R5e_9Q!BiIZZV}Z*rw1_Kpa@{WT<4i zFbZB#6mUy|9jq5i84KpY$3V9$74t!z!jEh>`8|)iaEXGmDc7-(11h|+gu*T}4%{9v z-^i#>&FvE=OAYmm>RHfHsEt^LcPy&la5Ny|i23C#dLwn@$ z?9*&U-i=s+aaGhHK53W`r~x+g2-OQqr*LziWs7G+`EbS6;QJey^HPZm!(Lrfl1mUm zd%0%WcXQhXS1hEEf=A>oqxgsQ>XM{f_jY&iPHM&6f!8p!Rf}I`-%o$eYe1vk*shWn kz)3tGDLe(3-CWs3HUO^vV81M?c&FI=7ehERKmY&$ delta 1085 zcma)5&rj4q6pj#0gkV_Q7)kswRsu>|3Ja`Dx6}lZRS!TSV#2}0bUSS)Oy|{hin|=( zX7q+m;?=W93B z_rH}Br$_f(T;B>3$hc?Jfk9$j^;@gz0~dymBg&eVf#aAFBW zRg#fTeyTEzlqA&GSQuY+e7!kM0WBy4O~>+0@IRjpQ@EzipLg^6?DUp{+^L`YMV50bK;*d})5 ztKoR>pK?@Xn~@L25pcpFm{U8FOq#og-195OHdmW&jW{GF6Aj>@BS- zNJD-oOfJO?H*-O@nd9`rYQ2WPK*`OK@<2P?RC?s+;^k}q+sC{!7j)ZAOvga?K@hY8 zoC-+LJ%S_KjOD4~O{eNY;*q5LWWCn
Reset your password on VoteMonitor Platform
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏

Reset your password on VoteMonitor Platform

Hello,

You are receiving this email because you requested help with your account credentials.

In order to reset your password please follow👉 this link👈and the instructions provided in the application.

If you don't want to change your password or didn't request this, just ignore and delete this message.

To keep your account secure, please don't forward this email to anyone.

Thank you,
- Vote Monitor Team


Commit Global.

\ No newline at end of file +
Reset your password on VoteMonitor Platform.
 ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏ ‌​‍‎‏
\ No newline at end of file diff --git a/utils/email-templates-builder/out/static/lincense.txt b/utils/email-templates-builder/out/static/lincense.txt deleted file mode 100644 index 4739bd6ec..000000000 --- a/utils/email-templates-builder/out/static/lincense.txt +++ /dev/null @@ -1,2 +0,0 @@ -Icon by Freepik -https://www.freepik.com/icon/paw_5720964#fromView=search&page=1&position=9&uuid=4e94ffb7-bd6b-4e2e-a331-4472f2f53475 \ No newline at end of file diff --git a/utils/email-templates-builder/out/static/logo.png b/utils/email-templates-builder/out/static/logo.png index 0bf3fbd5fac9d26ba0c4748a43d70459e653e4ee..fb1337c70e1ed59ae6b2b54cb940fe6dc941e7a9 100644 GIT binary patch literal 16135 zcmXwg1yGz#(=8et7IzO2+}+*X-QC?GxVtPKoZt}L-QC?ixI0|(e)r$1-I{uKN4lqH zy8HCm2n9KD1Xvtc5D*XqNeK}p5D+k?uXX_Rx3AAt1ch=C5O_gLVPOSHVPPT#CwntX z8&ePviHH<+C=KNij2!L6cmWGgh{E7ah!co-6d^dG4rn$Z6ryA-aKQmR40Ihhs(b@s zbx|~KA~%uR8fdn&C`d?CU7F<-cFNq-&YOU6?+K z)7dIUc1+-npLI+`DHY-=Mt8=a_~)*>r0rr&hQr7zsM2?*HBPb&H|%5ycg9)8j8b1!qifnola`=<0+d)zIiI5>A_{1sv(;Ya}T{JF2 zk!R4_n_3RhWYo%(qqowvhjsXoGMnXD?7QP(1(YRRPPz0u#V{iV!^)|I2 zgh7CS02GSGTsK-gB!sQ+z3-LWCMrCK06Y^2;WBkv9IWj-MQtM71cV%+EVy1l#CG7Y7))3PSs+C`@>?G_lp0+$JCvH`XV+2K z@+CYf6EdtA(|$q~n~5Ym$u|_?h#nDK9m2+LU^X(kr+b27D52<4!9+Gt; z7i2qm3>v^E+JVM2T^<-MwDB-F>CoDHHerGDB8 z*msKau8HlilDryH?nK2K=s)}`FGmSwjb(OyRI@stX@s5?mVM7=2#;@PzwU(}JZlg> zS5UMA@q4vun3qM*IMk4imnkbitq0^JuCM-jk!b4*ZyK3in+W6g@V_DOYFd)t;#uQ) z<97|e-aOA0U0QT!kYo^Jn3x>SrC&vLm(+#mgekh1i<_&16mDTYpPtG_pS1-X*ZUn| ze1QI(D(&g%G2UvaQ3k=g`nmRb>^_+R%8x$^qQfzo5)QYIN7n(^))qpzVBs}@82`zd z702uVwb@Mw5x@X|+!bU>gD98^KGlIQ4$w5<`vFE~K&Ao5_H)7jcNy{_FesM*56ZmT z(*e6a2zQ%Khj(Ke@)+u}+Z;kr0vbJ!*ejgTC}5d*5*qwkG%z0eJBFl~QUbh4xJ10> zuuvfcr6?Pbc7oMDh!YxTkd6pf{MxW^A*N@Hj}W5@M=n*B5#nMn0>D9F`Nqscp6i2P`beb7PzsYq6TbgY(y=m2BTW2s$qi$ zsn6t64P6D&YdESSj@;1s4lLpTsskM#`mZ4RKKAXlE3S6zu2BB|*K2zSs-B+);#VX! zFniG0!Ir@!LfD2-JJ36L>(U#+?jj_LVHToyKfM{#(?qi*b;Q;s*2Q^b&xrWQ5#uGk z^CsetgrSM<#@|Sa7Ty=~7AhB(7uwB2k(rVilbIJ86rqvj&4Lv%6>UgSq*PJyD!<66 zQE10^3@e%tcz*MQ^yF?y@CjL${g9c-)ll^Lah*&v>LbNjlR-RUgm+E~Hj^>0=OevdWr9!35dHgDR1E1@k)*>$H>;gXV4x#to zUL`L-zsdGVl1h=P8>bK2#YExoW_*{Go*+w{y+5y%Z=R&72^{75YrU1j+Vo@$C-=v zje#7rj+V#fFR`9Wzr*w5>`33VH!?u6B4J#ynl-ywnIC28aS1r#n|n1wV-D49UBRg% zuk&*@zO6m18@C?6)QG3W!brzBrO~3<)Yj4@*Q9H#XgaH%Z7|YC*ILlns4Lcb)s%0j z`qODATyMB+vSw3n*(7SaVZ&@oZBxCR=XT)+))wQ2UjSXeBMu|38uPbaz1Dmcb9rf* z-(}h{+(Bbo;quC<{`ok0rd+Hk`s48UFm11S1Y&fD+K>2dUt>-Zkn)ZyOvXm^>zsAl|R+!*J1X8gDBdgbrjf%K#7{l@Ovf%)#x zb@`3=zWw3U?bgm`v}ND8(S>0ryaPM{3J=C(>c(ioEE};OOc*Q*d@YbA2qlmWf)|<% zVG_Cu<^stPE*;y6D;a=8&`MRGWIKHLr+nqzkif96FQZSjcdwT{m_M>61|ZH7D>@V! zqs#lCS14M@@P`jpq_#j!d?T(gG6%<(CKL-5Um5w9Ws%ZN%|;rJ*3N1DqS^f#^qPA2 zl3asA0wn`w0fpkb8bzl(tPGXxUmSL?^)p9c(tQ%-2m)nca(^;DCHP*@U^V_0Z;!3e zOmHS@CAr)$568rh!YoM&@^aZj8NOsG30bL)?3WPKfzn<0!rD2ixtA823$6>e9DaL* zYT#ub{Qlc1X2eUT=1*N%um6Dy+ zg<@VYgZ47dfW_z?B|ZtaV#06hvZeV3<=26oU3^c8&HnaKAKE9JV!CsvGTwa+QMmn!D@2 zwdJRa(@SX8o^5V7t5K#^rkP8Mi;|13DdNfO73}(5PVYd3bX+?X2$i#Pmft#B&wix# zdkeB3nO5w$c62LmmQe;{m6gQWr)4zdqm9T-=r-Q1ypG;u_R(8q?#GuuR<2!39L$%h zmUSl<2o@IF5ZtPN3tE3??eHc)v)saMZpvHibUWqC_9c7m@f-O#f>J_S=fU!;IRWe` zoEt{a7c2t9Pe+J z_9}yyh?cxgnq+ydv$ULCtT>uivk$Q}WyA5i@AzCj*U^rrDr5T4;dLFmULTVU7QKvJ z08h0xwBp__9$pjJ9vfS!3Dj{`dDn2c2VJt-|GM9gH*{McRo7MPcOrWh?3wjWXlJ8x zwb@27$Ncpg`7!@gcT;pf*608HxvB|1` zn==%YC?2Eu1NG0I$l?<4D=!L=c@q$eD<3gzdj8K5SQ7raQNWYDhM!n6x;u!~&ZoBw z;al4Ygu$nq$6Mfw6)H%0F&N+yMgbGJ!{wruluca}0zCz)o!?n}P#oZ|yl*~9xckup zsidlY<@`#&Fz(~z!NK+Vl~Zt-YDk*N%7RdRwV^>k!z@7{zFMGP@2?2|>jjnz_J2>n zm~z4YuMHCL?@Nf9a7Q}XBP1hprrwQBT}6@Fd)0m)ZikK(HnTy6f>YR=oO<2@8t%i`~Kb7tdhjp zzlWs!DM6Av$poE0@TZE2pNQB;B4I)TGPcl1yZiA~544J?fxQnI0WF5=h=Z@#PhqOT3m|PrYIkpeY0jw1gwCSG`BF#2(!L{l)+ey4l#@C(_M>yaTf4bu}1m zQaZC!lG6N%`%mfGA=l=jpLoyg3Av)Y0*F7(y>$Oh8? zH2g)5;D>RN-e`eGcq{l{th)BjT%16UEV0xXlrz-PNVoneKA z&XO-q%tNZOLtI+IMav6oHw7bepk(r4H!`_pN0L+k7C1mj@ z!Q2m{q$BX$f4SR?fz9B}KmIeFP-qLt^lALp@n}R`mW-YGDkbW+m~OkGG)AVY`=Q(2 zz)_UK7)s}9ruj7{^hVv(njo$^m9FnBSp;q~n{3tV1pkfVD<;rZFOr=KT(k10_)R`Sge=cc%%OiiP6x^Yhxy;z)9 z$kt-$o{E69&>0{I5YX=!C*=|1(+! zv0R1t05!7!(-6#Jw3XZ$w9<`~xpSfNLy7TA|Id4=>=OA95GGMOe4G^2X(r9pd1htf z*tfSU=%}i?$nO+4cABEfsVA>YW>KNG$w;b(Q$z7I%%bCt^&ZPegniL`$0y|%25I-}Ob{T&S z`m+)f7APvg@q>q|ReOojCtl4=YuKR=a2thQt~bsLf^=w15He3ON{HR6f? zkot?%orNf(+DuzO%(1}<;yT-{5{Ndj(c;oWO^m=V-KjqchIWOyqOumLo9ziGX9#i< zYj|tIGSH3xCqGJn;|F(cJMr;eg476~kzXh?<#8n2b?q;i& zf6SeHj}+7iHnVS;+Vr5jU0U45V;vqt;-RM9fEvFm$|Vo-Nf*51l7eRP-DoKB^bEZ*2nu^6`#kBV zZbT=h(p+b~37E`aT=Ocj6IV%ghaUxW#gRstnr6`K1UVVK^Q#&?8fRDx(5xmgn1_PD}HOfowG8A`Zm?gc4+zZ{$u*gkX`-l>k^ag?@PJ ze<3$q7oZKOjVZV7!gw@qe1?+cX7%l-C;WQU(+sVL)*5_w{B93CG7V10 zOSK+@-K3v>n0>dFbP)mr_>{)?=sRhC>(Coz`!2CkMad+uUSqWKm-*1CmOwjNKxm={u2`} zO{1IG>2+Zzs}*214fbNOO#{QSej)ayQ?U zY-?mIF+W+1C2ZzL6bqs4j9&atv0l}F?FD^|{c;kH^_Rs!ctN&@p^_)f?dm53_cNnt zE4m%&>&0XfQTJ2QIX5esrQh6c#utmCAk)rZduRDZS@xkIvdsqlPLBkyz6qBOFps8y|Odghp0 zVB1e0l!Q4qyOu+;owV0qD~#Un3wP=G-+k9uU30PabqllqrZXnL2s4tjel3AXIT5l3Gh=nteJqw4{8*w3;V5#9@TpmXrjAdna#SF1Lk|!yT;+W5@XQt#Y-<;pLbkC%baC}1-a5JYvC(#mczcrv>6?II^qXg8 zT>#(_sa)hBY8uHRsZzYNry%~zV+n>)B`me(+OKtb{+9>)W&(L!5;iCqSPCR|zSbyy z=HA#3sQktLHoX>YOu<_`u!X|k@s@m+ez2R`+I=w$k}egWu_y6UXD%7Q^t7CEP^07ljtfj0xA+h&dxb0;T?Cmmim%OI}XDon=N{q)aT&JYK8Tz1nzeIhy8 zw8_ZJxoufMpB~=A)!IBFUlynLXtUfb7Mr~$44B!@CS!T(J>fptfC?4g%^1xc&M%|c z2QmiG7diE{lu2(aFn`8p@R*2LL~NeZ8;)#b2~vejBH`e%X5&|l4~@!(V$EG^ZHTKt z){nHLygXU%X`ip~)k?W(higBUx6YPy-o#SBqS1wVY0nmpN*D`ycuiT1gg{ZKFQKj? z*?bGRLG_MXFSa^rG*~Mt-$;9ENSySNQ;-10f!tr)JRA3n608B1>2BLosgq?Oa&Ih+ zL{+D1ovz;K>mX@NXVliH2$V#ep+Ylz(rcP#enn&_g8@>oG30WiG?;9ol3&>W@=YZW z7zmTPscorP?>^pWpcM<8vuzkSX8^Mm%T*H$)+8NOsnjjMb7XRQnm@(#t94@I zjkGk3vk0eAgjQUMW4^&|^UZfI#k?$l$jdk_L$go}SGX0k_+C+bspvzj5SwdaKE^7M z?eKbH{kKiy^s9~1sj}P+2mD5*{OxExLtMe|62p(3*!I=9+A0_t>Fkpml@sW7k0PlO z77G?c7f;33%cGPL7zk`+i(^dO`;*s!wi~u!uA~X!Tt>lA90cPmnj5U}8=qKuR6)Zx zYN=*zZ{se9Qqctl7F^~+c~wtZc~bW?WBj=6dk726NAMr)KhZPVUiil2JX;n zA(~trq)SOmV-ff#bBil?KAvjDikTh8HxHG9Ye@^t6^Hr9&x5}2g1U7&Wq^Y{oS8%n z7`Kd6a;Fv_dy=e*v)6WK&o&-*%4*Ah_j-w==> z8q18G0io?~9bcfiry|@4H}bvT#38VDca4srdM_ad)oo}o&p6fZb7YBn?lIB0g$AxV zpW2~r+7SY&R~d_-i=rokZ@-6dvX=TndvtE0;Eribr}sJn=|J!?QTD8jM=)~tq{rgL ziPdnJ4fo-;ze`&$k&z_@DL5S^Ba22=4x0(gBQ=x%xG1W!d}=~Vh^Q~DfTCSJh=A5> zCfy2cc;jXBV1&Ec{vR=;`qE1IhJKsf&fve|Zx$dQJhsg%#)op*RVW>`Qw;!G_B+HCY%^4BgWjMKuLinNq10NG4Ee*S!gTs!;b z^W%ipbFd*}=w|%75%PdhdOp4?ivmRnvoR@v1KaD-Gsj1&k?r~}@o1mpdYnxRXN78( z$$5kgE=qXMTL)7&ADquTB*qC;j3}gg5dzz)DJvsoZ>)bPa=y|uRkT;rAS-x=lLeC* zEei+zLV@`6^9{IpAF)lb6WsuOU^kliBi&hE>)B?aBQsU_jPe@Fmh%dS5-fqWQkcqL zV0zdZ9P4o^0t}|n7L0kpJcG9Bf+sK!n}Q1OR)fS=sxu0`?L{+p8;T`XwZhb5Y*ON{ zhWGI{6h;xAOz{8U9?I*=A^5tP91U1AjFz2!YCL0I)&Z5*9~04ht9b%RP3!gHd{-BH zYbD>IPmWV1Df0U62jc=C$}PiDCKBUWSGzpXXnZ**v6*gP#9UF|%m4TQ4T9;vMS$d_ zoD({5^5|p#L~p_`Q$89Xd({p!TX#@>Gg=nL0+0Q*-2O8!#xsh|EcD!^IPEiTi+i$( z-z`)hSB!Ho2Ei(m>#8^1u4>U7jz?USaNpH1Gszx^gb1-qH_-T?|CHnJJJsU8;j+f| zmReeHjH{|IFy?A{>qj-m2E@kz<3=`-Y6YiT58D$LW&<&Hw|)&%`q=vXJM8~q?G2V) zN?El-^7fngjH%$iYk|P-t-k_yy{U|sD)U>5)KzBd=zMH+n!+ZJNJ?=jg4gTLO;Ze2xd;@Xmt8U#F%cgF54fi$B2tIKP1RY#&{?D14^ps@Z zq6>y8wzvNwnpoe!xKT|4@3&C2(ur|cQXQKHadtEzt3x-jpT4m%^0HkmwC612YlFj6 zFn_sXf8^zKBH{Sh;f={@r<~}ZFf{$*GrIa-TwL#<0ef=`V~Oze!MPWQi_hxM^)S2S z3-A_Wq!Ug`1c3TKm~WG~Mp-a)`cC(G9Bml10nZxVpdQqKHi_(RTbN z(yX2n+B4`D$hxbTfdTZHPCRjYEsaq{isLtc{-vidTn-Q(REm-bpblg(`58hC|hx0 zz@>KqTdRtN!dI>Z-lw=91=#iZw@N6mN`MLU=vNTw8%rOQUSAupHnZ`POW1T(j2Y0@ z@CcOcou2yEZrd{*mh(CV4G$Br2+gz~doKAri}uFXY7G2Rec*a~AlsmZ2Gf@_1Qq}w z`kcRTtL%bdOyd6MFSD5TgvbT4SlaPlZ3`~$kTBE2tu06L_UigeV}5w;-%HDK0g3=x1Jro$`c`S8R}FpL!_C(Z-Gjq$+Bss z#q(LND)V7stDiUTsiRd2y@xZ8orQCaaVkX{gb*5y@UP?P7pLa9$`fK&|GZ)@VuofD zf2zqQa$9Sl-e1R#+ltsq_K$<8SNhaJG3qzd#OqDEJx4;yS%$`;oIRCZO5it4^u{7< z&hd`9Ek9npV;{3-z%UoRuX~hJM0oYNk{A-b>gw-O_~{wzy@RztuA=Hm-(5H3zR!3j zi@%QK{J42+s{1H3ZFi(%BOZ*- z{RimK1H!eReRI8W1FyBAb@Y3WDCa5{VVL?2k7GNA9m=JS1%0rWU$N}()O$8wK&~cK z0B)Qy`PyF;i`MlB+N)Sh&^BXhhhog43&_$^qpY(H&oGu9rYZxC_@|VnF=v_eIOno$ ze5$JZXD2Db@M1oLX%zfB!~D{rYFO)^3K&53;gPK{2b1b$_3I!JAiRoJ!!hxP@~|`h zGPj|F1S;~!uQP57OA!Oh5oF1pNInCA8Q$__d-UkiLloIJ8b-~PKl6javcY1T$3~ob ze5_|Jg0x$Kww|6Jm%Iccr2lk3N0;mpbLhm3P`6WJY$p9Of}}GulLn1nz1yDxdCv=$K*Xa%#y_iF6du=1R!*r;@K? zz4nN;D#SkO_HZp>Qr^S!*W&Yy9_`xqkWelz5}7epe`1}Cp5Hg;i)ZEG5ug_SNb%Z(54 zHfv1-+kA)F-9^h7mqQ5`#Tgl^2(Sc_o zpHh?v!FdM3@+p}TwLYM$y^X%048q^`N{A@8EHc5s(R>ZSLWiS*(K)94UJdW%KsacVj~PL0}I6n!*rDd0b%}~ zzxXc;#c@@Az?_P=k0vPSLg9CSl$2L}VvWEm50sEXU^Yewcp!swMgnATuD!NHy;eLi zB5yy6R;|_>A^v%^;NIwlSHbGUDZXTZOWi?=;z4a&11!4SY5s$gbU|v`fvV*kFcWBl z&UM{N-M8ZbOWR}2rmGYl@gqJI^L4yEs_Fy?vB4G18vbxN}cy#DTw+UrPT*o{6)&w1_q z<=He{>{Wc-dPe#NDoNjk!@? ziD?4O-fWyyDT88wpNp?xIBFk2oKgi9aW}oOT5(yMF+DgP!xu$%zni>KX^k_8Q5s|Y zHvt_x<%*45bv96LzA<_>uyeT%WJ2&|BXQ9u znYe0p&_s3D^auH<+^#yG?T%g_vF|mdpjh}N$`U#qns?weiZUcmLD_OTC!-j{?+>g4 z)#svVlMFqpbB>=0S-v0!T}zMYSL?iAf5rMrG{!k8CNX z)_xh=&_LyaUVN(li$zu>jE5%;Uk~fzHAbhNHnQUDki))JA}-sZK%{Y~vlAy>bQC9H z*}30AbTcykcn;Z?)EkW_tSfqjL7=Fe?e&(Cxvh9C_b{N~U_%Y9CM_!d`(N{?3CN5o zS~R+}ZYf%4BbyB8B4m3YGwR)~i3JV*xmdhI`SI7Bi=X9+6(e=_e$5NNUwQXmP= z^fvE7OiM0)lh(2_`uvrYS23aLwl(%*Yoklrr#ZZM;#F`!`jGTT5}~AOHk0MoN&ZIL z_lK#Jl5xYLI{c->{t@GZiHev@*9>=Q+c@y(j%ZVD{&EtUsh{V0a8J|``7-<>tMH@D zdV_0~?S$pFNVWw2l#Z%dI|;zdYE!~Iu-x60o|k`ASh+f8=2cOQV`aLS&emM9$zF?1 zlNu@vKESHGmgMbs(+A0wjucCK?$SY?is}(T8RN8Yy6mf#qVmVj_)+yw`i=T>%+n8D z>*(X<-E~XZ$IZTH$Vf9VkT^;=Lg4KT-q`wzY1dbEew%9busl> zT$ZM@Rm0Px$*a?J1u>Mht|Fcu^I~xaCmfT*4r@NRtBTp%zNvqlzZ)h1(@28L-WMCk zElx)DW4!BDPmZFJaVob~)R$N@cBaGhfWM^dLj(&%vXYoC7VDqo%Lt2s?<`lQ?$&eH zO*Bh!KWVF0_!^6A03`-znCeTIe}G2rtn7S%tU>_~nXeBfN15r4rLDy}t! zGd~$KFXj7#sSF#RKh~{Q_*+5##xijGtH6F@5@;0J5<~!jWxo?`iZ|cSr2Z69<$N z%4}_;nl=dDi&76%4!y@6Ii5ckihToS6@N3%7a)D%gKtFW5+wi3iT-%dlo8;J;2b1s099o=eN`E zuGqchOCQZ6i`qcjV%ls_HbBTSrH=g?C)55tdbUv+C%b&2l-}L_xYTutGS;!}N--rl z7C**;wolVmX=9PNBSz(c*9aeRxV%GFd{}c%c_0dqwn8Vm=h_&Wgk_pXUdV834Vqz{ zsA;q$CbTe?*{GCMJ&e&4YfpXS6@0cF;i{yc{HlCmlX%I6Uc};C*j>vEiU|<%(5F@O zOL4iOCUS%jXF=s51K`;=mu$NV_H1uGxsd^A=8B`3U+f4pk#0FlBa$j^+F=EX)Et?L z6j6NT4?D(A8L^ED6N{8%PQEtnp{oS{myW%f0DJg^^PEKPhiL?Ve4Zqj`H*s#0kPy$ z&32s-7|E=0qREx05wA4VF{(wCdh`R4Ow;roxFgG*U%j~4t268-+$nleQgt()f}!7E z8(WOWrjX)l3R$FsD%%Igw`4$&!ayoJ$|tR!J#OXdRuj>XWP$pf6;y`87yd>Qsx zDodqsZ7wx5CLl-7fWws ze|aqqbPz6q5iP%ls!Cc#PH?fLYMF@TR?Eaz#n6kc2Whnv@2 z-L`Q;263@|nS%G+pNp5@)ObA^24^O?nTxg=<@R+Q2(tIs^o*sBmdbxUD4R%@%W^p9 ziZ1k^nIHtX7&JFyrcHd(?`UY_kVK@@)x+(wJt7X9<`Q(=n(XETWZ!V7G>Gg`_gt?N zF=bGuo)vrJ2{RVD8;h$3;ZEjDKDO@7yg?@=Grzavi0+|I3Wam4zvXzJyG=bhU@T#&I6#%k4nV2&b=Ox>B{-F4zVOl~;xLkw^c| zosHJ4{rP$%_m~$qE>3vC_b^c?zXR{6o2*w>=vuTTo8MfOtErnb!fnY!#Rvhk%(q2u zLXg^LaT8pvsIMe7Y?qav8{}$&?A6od=BMsO7HDqX6vAATUA8dwA{(CW1Bn?Pz)4t7 z^4c5w{g5=xhBSd3=+m)ycx0ZnZ|=?v+^AgRw3`WQ%U)-lLZ1N4^?XN;ez0vnC~jah z)Qs!8ip>o9!EKfG!+~0RS(P+ zRm@g1Gi}TxU#1oeZPl=HU&lefF?2V!kr$xn!==QOmQr?c4DHgxKeOAo*eN`iC2lh= z36dligCpFW={xL0hM;$+Xvx}cW2{sNEKS6$x^447h<;Rk^U^+=7Y|X(2Bx8bgEW2W z?~bH7;PqGAP7wp}2Tw2l>JcsZP>{{fdjFWzerxv+gfHz;!lfPH&f<#O9V<*6(+w>< zBrVV?jH!()aj}~h1HvY>v5Gg@J%=N#;d86cwGB8xq-!<<_*FU_!DRo)_(A9ryO9hl z=zkp+8Zd}$xWTp2LhfWtMM zvyx$4-Cg`EVm(0J)o2?7HT%V#SVWvj`-E-QX=)mSV75)cJ6-)w8@3^HB#ha_ht&zW zC4GqZSpjQLBzh2xzZ5m9N1boF$wiPJEK_0r7tw(CA^7@_f|t!#Zuqxqf4gMNrfML| z3@_8Vj=8uc#4M9A9qY$a8ld}@p zK-zx2WrMHCGvE3gMVV)~ux$6|Z1SUV$VlkyUgPRtLE3_Zg;5TvfJ$H>Jh8;Z@^rFJ zTCOE`U0#p8y<*OiUdYOt^K|y%%!N_Tr?^|w#ccBqC#Te<-5S|P`Hj?ryFx?tCl$|> zS_Om~Q>pArP3Bd=Um6R))k<<|FOt%iQIgX>FJ(2!IIFoZQv%?V0c z$&mw;M1=^_;d~C_o*)-i^p+cP!bdDRcu-Ph?5!8w>XIpiF{m z*~o>B)3)8jbut&bpRn6d@exq3V&>Pxt&VHA<%-U5J!4hY^RLHfegh35j+@I=;0cmC zKzDf;U$sHL^<|WdTz3bwxIBb+xlS;RkrhakC%#EHB}o)3EFtw%AUvGn;#kKpHeqJ; zPAeW}!QR~L3CL`rBiUiuP*F^#G_wO)I6^CRv6YB|`-BnWX?-i{UCP{SO*_YH6kX5M zOZb`gaGdK1W45R9Hx)Ls%V1F!3?7023n7U-G_`yQ>fBm%CS(bQmLso|iqD94yMmX- zU_5qi4LtrQ*G)f}82>B4Kw?{x86BFjtAkgrq-jU1($xao{Cvl- z-Jf|3mbssh#dVhRk?(Tkm`~&VLQ<;aO@^MRf4W2TQG?t*3?_0RC0MQaGY}p@!b+FZ zoF{tsUv^R)YQ6wpym@%FIzh8I=;FMds6(MgGD6e2`VB0P;a21w6pkY;-k|PT*-2Cm znVyKI{wr_fI3z2EhIyxlVXkNSO|R%d&+&a)DBN?FjX3m0r7-2BgGiVN;$j)_>RgTg#K2q;cf%nA+)sZun?BFnUKh=XLRmq+ZPq>6pig5)e%o1h54Fh#r zv?Fg?f#mbD*Rg;55v~Z-c6m&nm)A3*B7oAuDP){Lwo4HiCio^au8d*x+;2_sIsTYrycdRrjs1_j)#a0eOzhh8N*p{?OptZY6NR^dtulTdhierxR)gTB)i z+yB}7%m1yVscch3lYG{LMO3P%2^;AgWxMaA_MPvmAt>^L=nD(5L4zO5Yu z1tn0&)^M)!)lVx^Lew*rgL6010pgAd0J}!}F?3?A{x#E!=$qBIzdKqTi?E-Y?c zWuvYSe$_&>71EF08zmjU<(liZ@GQbruboZYNo0)&>cwzX==e<2RjW*RpAilzRlS79 zpDs2<#eE15uy?WOEZo`qpL>t7eK}Iu1br;GJ2Dp}*^~d{`q{t*2-47s8c?YyE2mS(8KKGO754#hfUHsz(+n@&s!Y~zPFzNHl zv>HqQwl(BnXU4%_-cxZfJ^Syp;cT#N&=kh`&rW6`5CcbF zyICPLb?=#o{6K}DxcdP@g#Psn^8C;z(o7*9l;YEmxW=X-xao+AC7%6{=nZ@Dd{ld1E--L?45Js8!WQ3B6j44PgE`Yb z%5;2CHxVRuZxFnH-WOKcQ>=qwdwv$9ms(y=Co3&Acdsfhx8L<9EAQ32!5}DLWF15- zKE&1&KK75^@D2^H7Ek;Gm{Z6h(}0(=r|#I4v(PIN6+X=Wp7R)OIpbjyg`WB2W^FfS z&G1Vxek2SQf`=bT)#~+I(g%4VY{k85TlUmVTWnzab{$XlwtJD!E3jZAws4KJ-`RV= zSeZd$2GfD?F+PC!@p*i0=W-R7CcgRja~q~MZFjfhzlQB1XwP0aCRAU7FqlAmqaTjn zp(p8HU2WXnM0R#-iscom*B}4&NtfDP0xr`1Bk~Qzafj|-IS3pYUN4?lCdia{?|6Ac zv4-_(;LyE;)JNgw^;b~%FlOa zo`@-^XaOuyziw!UrLW?P0WNe65o*59Dt=pQTf@#K%UUzSU(2A4%F~`&dX-^(?*?i& zeXsuaeIoX|hY+rEPxm9wq6xnoXR9m!U~Pilm+6t#Fe!c+fCg!I;5bg?Ld0pD z{+>;Ol$?$bu5m+x9@d6e2GL?rRQEnHygXUKsEQT-f3cqzN<8y!U zHKbLk+k*kZY>fM*^VNG>2J2%Ni|;sdFW$^~KW^@mOe4P((hbdl2*(uJ_H(_qw$VRt z*vV$2QZOoCTV9o=E$i?Td8YE&00I{9bLSFy$dC#oqV7vO-LRk-CM-3c42QDj#94yq z;9GMn9aZ{JUx_^^0b%q{P_VODTM!h?e|9qarO1K+8keC>8sdb2YW^JSNKCRvd&vj{ zpQypCTV-egYUg8LFNZ9tL+LL83?Qh8ztoB7<1j>CunCD?x^3qh{+Idf{;z?pOm(QU zcQ*2_h+leq2NvOfi=Pkt(kCZF=*6-<(SV9$lV9eX2z#9d?%afK3b@zd1|Shr9U4od3G!?YaX$;HvQU`iqoc$?w(I@o)2WNv=LYXWUO-0$cYN{{5ju NQdCZ)O2{Da{{iv6F3tb| literal 28099 zcmX6_1yq#J*M67o?v|Dkq#G$gN~I+QY3T(-5SEZG0RdqN7o??sbf*d|EZr$A9fEXx zum6v8IKa!!+&g#f+<2bZjef5Cl$d~l0001DO%2tT0DuAhiUHu^fIm*(Obu)R{a$<70e*gdLQZZj-nOqj z?1bFC9I_7N7yy6`&{Tb5@D9GW=m)3TxWzph5fyDQK6~Ghf4=ktOYM`Ts?<+)rDPKX zcYW?<-$m?0oOr?LewKI!@fX#37!-^#HtuYOr5F?sBo0u3Q-Z*iCW}#aym g?sS0(7>2R|4f>j|^5)PESu6sx_k- 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%0A#SJ~nCGqhG386Te>{WImKrk~ZL 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 AO8@`> From 00c393693e7b100049776b199ba1469fe27304d0 Mon Sep 17 00:00:00 2001 From: Ion Dormenco Date: Tue, 28 May 2024 11:43:53 +0300 Subject: [PATCH 2/4] added logo --- utils/email-templates-builder/package.json | 13 +- utils/email-templates-builder/pnpm-lock.yaml | 1263 ++++++++++------- .../tailwind.config.ts | 60 + web/public/logo.png | Bin 0 -> 16135 bytes 4 files changed, 801 insertions(+), 535 deletions(-) create mode 100644 utils/email-templates-builder/tailwind.config.ts create mode 100644 web/public/logo.png diff --git a/utils/email-templates-builder/package.json b/utils/email-templates-builder/package.json index 3470a0163..f6a31687f 100644 --- a/utils/email-templates-builder/package.json +++ b/utils/email-templates-builder/package.json @@ -7,14 +7,13 @@ "export": "email export" }, "dependencies": { - "@react-email/components": "0.0.16", - "@react-email/img": "0.0.7", - "@react-email/tailwind": "^0.0.15", - "react": "18.2.0", - "react-email": "2.1.1" + "@react-email/components": "0.0.19", + "@react-email/tailwind": "^0.0.18", + "react": "18.3.1", + "react-email": "2.1.4" }, "devDependencies": { - "@types/react": "18.2.33", - "@types/react-dom": "18.2.14" + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0" } } diff --git a/utils/email-templates-builder/pnpm-lock.yaml b/utils/email-templates-builder/pnpm-lock.yaml index ef0400259..64e3eea26 100644 --- a/utils/email-templates-builder/pnpm-lock.yaml +++ b/utils/email-templates-builder/pnpm-lock.yaml @@ -6,28 +6,25 @@ settings: dependencies: '@react-email/components': - specifier: 0.0.16 - version: 0.0.16(@types/react@18.2.33)(react@18.2.0) - '@react-email/img': - specifier: 0.0.7 - version: 0.0.7(react@18.2.0) + specifier: 0.0.19 + version: 0.0.19(@types/react@18.3.3)(react@18.3.1) '@react-email/tailwind': - specifier: ^0.0.15 - version: 0.0.15(react@18.2.0) + specifier: ^0.0.18 + version: 0.0.18(react@18.3.1) react: - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.1 + version: 18.3.1 react-email: - specifier: 2.1.1 - version: 2.1.1(eslint@9.0.0) + specifier: 2.1.4 + version: 2.1.4(eslint@9.0.0) devDependencies: '@types/react': - specifier: 18.2.33 - version: 18.2.33 + specifier: 18.3.3 + version: 18.3.3 '@types/react-dom': - specifier: 18.2.14 - version: 18.2.14 + specifier: 18.3.0 + version: 18.3.0 packages: @@ -41,24 +38,185 @@ packages: engines: {node: '>=10'} dev: false + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@babel/code-frame@7.24.6: + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.0 + dev: false + + /@babel/compat-data@7.24.6: + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.24.5: + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.5) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.24.6: + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false + + /@babel/helper-compilation-targets@7.24.6: + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.24.6: + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.24.6: + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + dev: false + + /@babel/helper-hoist-variables@7.24.6: + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: false + + /@babel/helper-module-imports@7.24.6: + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: false + + /@babel/helper-module-transforms@7.24.6(@babel/core@7.24.5): + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + dev: false + + /@babel/helper-simple-access@7.24.6: + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: false + + /@babel/helper-split-export-declaration@7.24.6: + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: false + /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} dev: false + /@babel/helper-string-parser@7.24.6: + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: false - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + /@babel/helper-validator-identifier@7.24.6: + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.24.6: + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.24.6: + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + dev: false + + /@babel/highlight@7.24.6: + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: false + + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 dev: false + /@babel/parser@7.24.6: + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.6 + dev: false + /@babel/runtime@7.24.4: resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} @@ -66,6 +224,33 @@ packages: regenerator-runtime: 0.14.1 dev: false + /@babel/template@7.24.6: + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + dev: false + + /@babel/traverse@7.24.6: + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/types@7.24.0: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} @@ -75,6 +260,15 @@ packages: to-fast-properties: 2.0.0 dev: false + /@babel/types@7.24.6: + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + dev: false + /@emotion/is-prop-valid@0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true @@ -346,15 +540,15 @@ packages: '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@floating-ui/dom': 1.6.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false /@floating-ui/utils@0.2.1: @@ -430,12 +624,12 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /@next/env@14.1.0: - resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} + /@next/env@14.1.4: + resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==} dev: false - /@next/swc-darwin-arm64@14.1.0: - resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} + /@next/swc-darwin-arm64@14.1.4: + resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -443,8 +637,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@14.1.0: - resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} + /@next/swc-darwin-x64@14.1.4: + resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -452,8 +646,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@14.1.0: - resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} + /@next/swc-linux-arm64-gnu@14.1.4: + resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -461,8 +655,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@14.1.0: - resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} + /@next/swc-linux-arm64-musl@14.1.4: + resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -470,8 +664,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@14.1.0: - resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} + /@next/swc-linux-x64-gnu@14.1.4: + resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -479,8 +673,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@14.1.0: - resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} + /@next/swc-linux-x64-musl@14.1.4: + resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -488,8 +682,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@14.1.0: - resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} + /@next/swc-win32-arm64-msvc@14.1.4: + resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -497,8 +691,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@14.1.0: - resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} + /@next/swc-win32-ia32-msvc@14.1.4: + resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -506,8 +700,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@14.1.0: - resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} + /@next/swc-win32-x64-msvc@14.1.4: + resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -557,7 +751,7 @@ packages: '@babel/runtime': 7.24.4 dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -571,14 +765,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -593,20 +787,20 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -620,17 +814,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -640,11 +834,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -654,11 +848,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -668,36 +862,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@types/react': 18.2.33 - react: 18.2.0 - dev: false - - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -712,17 +881,17 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -732,11 +901,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -750,16 +919,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -769,12 +938,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - react: 18.2.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' @@ -789,57 +958,27 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 aria-hidden: 1.2.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.3)(react@18.3.1) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -853,44 +992,23 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.3)(react@18.3.1) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -904,14 +1022,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -925,15 +1043,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -947,14 +1065,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -969,21 +1087,21 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-slot@1.0.2(@types/react@18.2.33)(react@18.2.0): + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -993,12 +1111,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - react: 18.2.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: '@types/react': '*' @@ -1013,19 +1131,19 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + dev: false + + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} peerDependencies: '@types/react': '*' @@ -1040,16 +1158,16 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false - /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): + resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1063,24 +1181,24 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.33)(react@18.2.0): + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -1090,11 +1208,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -1104,12 +1222,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - react: 18.2.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -1119,12 +1237,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - react: 18.2.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -1134,11 +1252,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -1149,11 +1267,11 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.33)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -1163,12 +1281,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) - '@types/react': 18.2.33 - react: 18.2.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.3)(react@18.3.1) + '@types/react': 18.3.3 + react: 18.3.1 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -1182,11 +1300,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.4 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false /@radix-ui/rect@1.0.1: @@ -1195,219 +1313,220 @@ packages: '@babel/runtime': 7.24.4 dev: false - /@react-email/body@0.0.7(react@18.2.0): - resolution: {integrity: sha512-vjJ5P1MUNWV0KNivaEWA6MGj/I3c764qQJMsKjCHlW6mkFJ4SXbm2OlQFtKAb++Bj8LDqBlnE6oW77bWcMc0NA==} + /@react-email/body@0.0.8(react@18.3.1): + resolution: {integrity: sha512-gqdkNYlIaIw0OdpWu8KjIcQSIFvx7t2bZpXVxMMvBS859Ia1+1X3b5RNbjI3S1ZqLddUf7owOHkO4MiXGE+nxg==} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/button@0.0.14(react@18.2.0): - resolution: {integrity: sha512-SMk40moGcAvkHIALX4XercQlK0PNeeEIam6OXHw68ea9WtzzqVwiK4pzLY0iiMI9B4xWHcaS2lCPf3cKbQBf1Q==} + /@react-email/button@0.0.15(react@18.3.1): + resolution: {integrity: sha512-9Zi6SO3E8PoHYDfcJTecImiHLyitYWmIRs0HE3Ogra60ZzlWP2EXu+AZqwQnhXuq+9pbgwBWNWxB5YPetNPTNA==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/code-block@0.0.3(react@18.2.0): - resolution: {integrity: sha512-nxhl7WjjM2cOYtl0boBZfSObTrUCz2LbarcMyHkTVAsA9rbjbtWAQF7jmlefXJusk3Uol5l2c8hTh2lHLlHTRQ==} + /@react-email/code-block@0.0.4(react@18.3.1): + resolution: {integrity: sha512-xjVLi/9dFNJ70N7hYme+21eQWa3b9/kgp4V+FKQJkQCuIMobxPRCIGM5jKD/0Vo2OqrE5chYv/dkg/aP8a8sPg==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: prismjs: 1.29.0 - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/code-inline@0.0.1(react@18.2.0): - resolution: {integrity: sha512-SeZKTB9Q4+TUafzeUm/8tGK3dFgywUHb1od/BrAiJCo/im65aT+oJfggJLjK2jCdSsus8odcK2kReeM3/FCNTQ==} + /@react-email/code-inline@0.0.2(react@18.3.1): + resolution: {integrity: sha512-0cmgbbibFeOJl0q04K9jJlPDuJ+SEiX/OG6m3Ko7UOkG3TqjRD8Dtvkij6jNDVfUh/zESpqJCP2CxrCLLMUjdA==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/column@0.0.9(react@18.2.0): - resolution: {integrity: sha512-1ekqNBgmbS6m97/sUFOnVvQtLYljUWamw8Y44VId95v6SjiJ4ca+hMcdOteHWBH67xkRofEOWTvqDRea5SBV8w==} + /@react-email/column@0.0.10(react@18.3.1): + resolution: {integrity: sha512-MnP8Mnwipr0X3XtdD6jMLckb0sI5/IlS6Kl/2F6/rsSWBJy5Gg6nizlekTdkwDmy0kNSe3/1nGU0Zqo98pl63Q==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/components@0.0.16(@types/react@18.2.33)(react@18.2.0): - resolution: {integrity: sha512-1WATpMSH03cRvhfNjGl/Up3seZJOzN9KLzlk3Q9g/cqNhZEJ7HYxoZM4AQKAI0V3ttXzzxKv8Oj+AZQLHDiICA==} + /@react-email/components@0.0.19(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-yf49eIq0NDDXzO2RTZaT8fKa16eKUFMdWWMx4V5Bq+b2JdGuAMobO5s9Ea6azSVL6RDcJ8epdY1TCR2kL2PPHw==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 - dependencies: - '@react-email/body': 0.0.7(react@18.2.0) - '@react-email/button': 0.0.14(react@18.2.0) - '@react-email/code-block': 0.0.3(react@18.2.0) - '@react-email/code-inline': 0.0.1(react@18.2.0) - '@react-email/column': 0.0.9(react@18.2.0) - '@react-email/container': 0.0.11(react@18.2.0) - '@react-email/font': 0.0.5(react@18.2.0) - '@react-email/head': 0.0.7(react@18.2.0) - '@react-email/heading': 0.0.11(@types/react@18.2.33)(react@18.2.0) - '@react-email/hr': 0.0.7(react@18.2.0) - '@react-email/html': 0.0.7(react@18.2.0) - '@react-email/img': 0.0.7(react@18.2.0) - '@react-email/link': 0.0.7(react@18.2.0) - '@react-email/markdown': 0.0.9(react@18.2.0) - '@react-email/preview': 0.0.8(react@18.2.0) - '@react-email/render': 0.0.12 - '@react-email/row': 0.0.7(react@18.2.0) - '@react-email/section': 0.0.11(react@18.2.0) - '@react-email/tailwind': 0.0.15(react@18.2.0) - '@react-email/text': 0.0.7(react@18.2.0) - react: 18.2.0 + react: ^18.2.0 + dependencies: + '@react-email/body': 0.0.8(react@18.3.1) + '@react-email/button': 0.0.15(react@18.3.1) + '@react-email/code-block': 0.0.4(react@18.3.1) + '@react-email/code-inline': 0.0.2(react@18.3.1) + '@react-email/column': 0.0.10(react@18.3.1) + '@react-email/container': 0.0.12(react@18.3.1) + '@react-email/font': 0.0.6(react@18.3.1) + '@react-email/head': 0.0.9(react@18.3.1) + '@react-email/heading': 0.0.12(@types/react@18.3.3)(react@18.3.1) + '@react-email/hr': 0.0.8(react@18.3.1) + '@react-email/html': 0.0.8(react@18.3.1) + '@react-email/img': 0.0.8(react@18.3.1) + '@react-email/link': 0.0.8(react@18.3.1) + '@react-email/markdown': 0.0.10(react@18.3.1) + '@react-email/preview': 0.0.9(react@18.3.1) + '@react-email/render': 0.0.15 + '@react-email/row': 0.0.8(react@18.3.1) + '@react-email/section': 0.0.12(react@18.3.1) + '@react-email/tailwind': 0.0.18(react@18.3.1) + '@react-email/text': 0.0.8(react@18.3.1) + react: 18.3.1 transitivePeerDependencies: - '@types/react' dev: false - /@react-email/container@0.0.11(react@18.2.0): - resolution: {integrity: sha512-jzl/EHs0ClXIRFamfH+NR/cqv4GsJJscqRhdYtnWYuRAsWpKBM1muycrrPqIVhWvWi6sFHInWTt07jX+bDc3SQ==} + /@react-email/container@0.0.12(react@18.3.1): + resolution: {integrity: sha512-HFu8Pu5COPFfeZxSL+wKv/TV5uO/sp4zQ0XkRCdnGkj/xoq0lqOHVDL4yC2Pu6fxXF/9C3PHDA++5uEYV5WVJw==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/font@0.0.5(react@18.2.0): - resolution: {integrity: sha512-if/qKYmH3rJ2egQJoKbV8SfKCPavu+ikUq/naT/UkCr8Q0lkk309tRA0x7fXG/WeIrmcipjMzFRGTm2TxTecDw==} + /@react-email/font@0.0.6(react@18.3.1): + resolution: {integrity: sha512-sZZFvEZ4U3vNCAZ8wXqIO3DuGJR2qE/8m2fEH+tdqwa532zGO3zW+UlCTg0b9455wkJSzEBeaWik0IkNvjXzxw==} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/head@0.0.7(react@18.2.0): - resolution: {integrity: sha512-IcXL4jc0H1qzAXJCD9ajcRFBQdbUHkjKJyiUeogpaYSVZSq6cVDWQuGaI23TA9k+pI2TFeQimogUFb3Kgeeudw==} + /@react-email/head@0.0.9(react@18.3.1): + resolution: {integrity: sha512-dF3Uv1qy3oh+IU2atXdv5Xk0hk2udOlMb1A/MNGngC0eHyoEV9ThA0XvhN7mm5x9dDLkVamoWUKXDtmkiuSRqQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/heading@0.0.11(@types/react@18.2.33)(react@18.2.0): - resolution: {integrity: sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA==} + /@react-email/heading@0.0.12(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-eB7mpnAvDmwvQLoPuwEiPRH4fPXWe6ltz6Ptbry2BlI88F0a2k11Ghb4+sZHBqg7vVw/MKbqEgtLqr3QJ/KfCQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - react: 18.2.0 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 transitivePeerDependencies: - '@types/react' dev: false - /@react-email/hr@0.0.7(react@18.2.0): - resolution: {integrity: sha512-8suK0M/deXHt0DBSeKhSC4bnCBCBm37xk6KJh9M0/FIKlvdltQBem52YUiuqVl1XLB87Y6v6tvspn3SZ9fuxEA==} + /@react-email/hr@0.0.8(react@18.3.1): + resolution: {integrity: sha512-JLVvpCg2wYKEB+n/PGCggWG9fRU5e4lxsGdpK5SDLsCL0ic3OLKSpHMfeE+ZSuw0GixAVVQN7F64PVJHQkd4MQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/html@0.0.7(react@18.2.0): - resolution: {integrity: sha512-oy7OoRtoOKApVI/5Lz1OZptMKmMYJu9Xn6+lOmdBQchAuSdQtWJqxhrSj/iI/mm8HZWo6MZEQ6SFpfOuf8/P6Q==} + /@react-email/html@0.0.8(react@18.3.1): + resolution: {integrity: sha512-arII3wBNLpeJtwyIJXPaILm5BPKhA+nvdC1F9QkuKcOBJv2zXctn8XzPqyGqDfdplV692ulNJP7XY55YqbKp6w==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/img@0.0.7(react@18.2.0): - resolution: {integrity: sha512-up9tM2/dJ24u/CFjcvioKbyGuPw1yeJg605QA7VkrygEhd0CoQEjjgumfugpJ+VJgIt4ZjT9xMVCK5QWTIWoaA==} + /@react-email/img@0.0.8(react@18.3.1): + resolution: {integrity: sha512-jx/rPuKo31tV18fu7P5rRqelaH5wkhg83Dq7uLwJpfqhbi4KFBGeBfD0Y3PiLPPoh+WvYf+Adv9W2ghNW8nOMQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/link@0.0.7(react@18.2.0): - resolution: {integrity: sha512-hXPChT3ZMyKnUSA60BLEMD2maEgyB2A37yg5bASbLMrXmsExHi6/IS1h2XiUPLDK4KqH5KFaFxi2cdNo1JOKwA==} + /@react-email/link@0.0.8(react@18.3.1): + resolution: {integrity: sha512-nVikuTi8WJHa6Baad4VuRUbUCa/7EtZ1Qy73TRejaCHn+vhetc39XGqHzKLNh+Z/JFL8Hv9g+4AgG16o2R0ogQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/markdown@0.0.9(react@18.2.0): - resolution: {integrity: sha512-t//19Zz+W5svKqrSrqoOLpf6dq70jbwYxX8Z+NEMi4LqylklccOaYAyKrkYyulfZwhW7KDH9d2wjVk5jfUABxQ==} + /@react-email/markdown@0.0.10(react@18.3.1): + resolution: {integrity: sha512-MH0xO+NJ4IuJcx9nyxbgGKAMXyudFjCZ0A2GQvuWajemW9qy2hgnJ3mW3/z5lwcenG+JPn7JyO/iZpizQ7u1tA==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - md-to-react-email: 5.0.2(react@18.2.0) - react: 18.2.0 + md-to-react-email: 5.0.2(react@18.3.1) + react: 18.3.1 dev: false - /@react-email/preview@0.0.8(react@18.2.0): - resolution: {integrity: sha512-Jm0KUYBZQd2w0s2QRMQy0zfHdo3Ns+9bYSE1OybjknlvhANirjuZw9E5KfWgdzO7PyrRtB1OBOQD8//Obc4uIQ==} + /@react-email/preview@0.0.9(react@18.3.1): + resolution: {integrity: sha512-2fyAA/zzZYfYmxfyn3p2YOIU30klyA6Dq4ytyWq4nfzQWWglt5hNDE0cMhObvRtfjM9ghMSVtoELAb0MWiF/kw==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/render@0.0.12: - resolution: {integrity: sha512-S8WRv/PqECEi6x0QJBj0asnAb5GFtJaHlnByxLETLkgJjc76cxMYDH4r9wdbuJ4sjkcbpwP3LPnVzwS+aIjT7g==} + /@react-email/render@0.0.15: + resolution: {integrity: sha512-/pT5dBu0y1mogrfEpc002rgRcXpbShK6PFtxTVU6LZZ+bccvZPgk67HKc01lxpa1eYGQgZ6I+VQ02GRnMDclTg==} engines: {node: '>=18.0.0'} dependencies: html-to-text: 9.0.5 js-beautify: 1.15.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + react-promise-suspense: 0.3.4 dev: false - /@react-email/row@0.0.7(react@18.2.0): - resolution: {integrity: sha512-h7pwrLVGk5CIx7Ai/oPxBgCCAGY7BEpCUQ7FCzi4+eThcs5IdjSwDPefLEkwaFS8KZc56UNwTAH92kNq5B7blg==} + /@react-email/row@0.0.8(react@18.3.1): + resolution: {integrity: sha512-JsB6pxs/ZyjYpEML3nbwJRGAerjcN/Pa/QG48XUwnT/MioDWrUuyQuefw+CwCrSUZ2P1IDrv2tUD3/E3xzcoKw==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/section@0.0.11(react@18.2.0): - resolution: {integrity: sha512-3bZ/DuvX1julATI7oqYza6pOtWZgLJDBaa62LFFEvYjisyN+k6lrP2KOucPsDKu2DOkUzlQgK0FOm6VQJX+C0w==} + /@react-email/section@0.0.12(react@18.3.1): + resolution: {integrity: sha512-UCD/N/BeOTN4h3VZBUaFdiSem6HnpuxD1Q51TdBFnqeNqS5hBomp8LWJJ9s4gzwHWk1XPdNfLA3I/fJwulJshg==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/tailwind@0.0.15(react@18.2.0): - resolution: {integrity: sha512-TE3NQ7VKhhvv3Zv0Z1NtoV6AF7aOWiG4juVezMZw1hZCG0mkN6iXC63u23vPQi12y6xCp20ZUHfg67kQeDSP/g==} + /@react-email/tailwind@0.0.18(react@18.3.1): + resolution: {integrity: sha512-ob8CXX/Pqq1U8YfL5OJTL48WJkixizyoXMMRYTiDLDN9LVLU7lSLtcK9kOD9CgFbO2yUPQr7/5+7gnQJ+cXa8Q==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false - /@react-email/text@0.0.7(react@18.2.0): - resolution: {integrity: sha512-eHCx0mdllGcgK9X7wiLKjNZCBRfxRVNjD3NNYRmOc3Icbl8M9JHriJIfxBuGCmGg2UAORK5P3KmaLQ8b99/pbA==} + /@react-email/text@0.0.8(react@18.3.1): + resolution: {integrity: sha512-uvN2TNWMrfC9wv/LLmMLbbEN1GrMWZb9dBK14eYxHHAEHCeyvGb5ePZZ2MPyzO7Y5yTC+vFEnCEr76V+hWMxCQ==} engines: {node: '>=18.0.0'} peerDependencies: - react: 18.2.0 + react: ^18.2.0 dependencies: - react: 18.2.0 + react: 18.3.1 dev: false /@selderee/plugin-htmlparser2@0.11.0: @@ -1597,21 +1716,17 @@ packages: /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - /@types/react-dom@18.2.14: - resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} dependencies: - '@types/react': 18.2.33 + '@types/react': 18.3.3 - /@types/react@18.2.33: - resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} + /@types/react@18.3.3: + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.23.0 csstype: 3.1.3 - /@types/scheduler@0.23.0: - resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - /@types/webpack@5.28.5(@swc/core@1.3.101)(esbuild@0.19.11): resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} dependencies: @@ -1801,6 +1916,13 @@ packages: engines: {node: '>=12'} dev: false + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1840,7 +1962,7 @@ packages: tslib: 2.6.2 dev: false - /autoprefixer@10.4.14(postcss@8.4.35): + /autoprefixer@10.4.14(postcss@8.4.38): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -1852,17 +1974,10 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: false - /babel-walk@3.0.0: - resolution: {integrity: sha512-fdRxJkQ9MUSEi4jH2DcV3FAPFktk0wefilxrwNyUuWpoWawQGN7G7cB+fOYTtFfI6XNkFgwqJ/D3G18BoJJ/jg==} - engines: {node: '>= 10.0.0'} - dependencies: - '@babel/types': 7.24.0 - dev: false - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false @@ -1952,6 +2067,15 @@ packages: resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==} dev: false + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2011,6 +2135,12 @@ packages: engines: {node: '>=6'} dev: false + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2018,6 +2148,10 @@ packages: color-name: 1.1.4 dev: false + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false @@ -2052,6 +2186,10 @@ packages: proto-list: 1.2.4 dev: false + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} @@ -2278,6 +2416,11 @@ packages: engines: {node: '>=6'} dev: false + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2422,6 +2565,10 @@ packages: engines: {node: '>=0.8.x'} dev: false + /fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: false @@ -2497,7 +2644,7 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: false - /framer-motion@10.17.4(react-dom@18.2.0)(react@18.2.0): + /framer-motion@10.17.4(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==} peerDependencies: react: ^18.0.0 @@ -2508,8 +2655,8 @@ packages: react-dom: optional: true dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 @@ -2531,6 +2678,11 @@ packages: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: false + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + /get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -2580,6 +2732,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2589,6 +2742,11 @@ packages: path-is-absolute: 1.0.1 dev: false + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + /globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2602,6 +2760,11 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: false + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2658,6 +2821,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -2787,6 +2951,12 @@ packages: argparse: 2.0.1 dev: false + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: false @@ -2803,6 +2973,12 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: false + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -2871,6 +3047,12 @@ packages: engines: {node: 14 || >=16.14} dev: false + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2884,13 +3066,13 @@ packages: hasBin: true dev: false - /md-to-react-email@5.0.2(react@18.2.0): + /md-to-react-email@5.0.2(react@18.3.1): resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==} peerDependencies: react: 18.x dependencies: marked: 7.0.4 - react: 18.2.0 + react: 18.3.1 dev: false /merge-stream@2.0.0: @@ -2983,8 +3165,8 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false - /next@14.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} + /next@14.1.4(@babel/core@7.24.5)(react-dom@18.2.0)(react@18.3.1): + resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -2998,25 +3180,25 @@ packages: sass: optional: true dependencies: - '@next/env': 14.1.0 + '@next/env': 14.1.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001607 graceful-fs: 4.2.11 postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.1.0 - '@next/swc-darwin-x64': 14.1.0 - '@next/swc-linux-arm64-gnu': 14.1.0 - '@next/swc-linux-arm64-musl': 14.1.0 - '@next/swc-linux-x64-gnu': 14.1.0 - '@next/swc-linux-x64-musl': 14.1.0 - '@next/swc-win32-arm64-msvc': 14.1.0 - '@next/swc-win32-ia32-msvc': 14.1.0 - '@next/swc-win32-x64-msvc': 14.1.0 + '@next/swc-darwin-arm64': 14.1.4 + '@next/swc-darwin-x64': 14.1.4 + '@next/swc-linux-arm64-gnu': 14.1.4 + '@next/swc-linux-arm64-musl': 14.1.4 + '@next/swc-linux-x64-gnu': 14.1.4 + '@next/swc-linux-x64-musl': 14.1.4 + '@next/swc-win32-arm64-msvc': 14.1.4 + '@next/swc-win32-ia32-msvc': 14.1.4 + '@next/swc-win32-x64-msvc': 14.1.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -3172,29 +3354,29 @@ packages: engines: {node: '>= 6'} dev: false - /postcss-import@15.1.0(postcss@8.4.35): + /postcss-import@15.1.0(postcss@8.4.38): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 dev: false - /postcss-js@4.0.1(postcss@8.4.35): + /postcss-js@4.0.1(postcss@8.4.38): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.35 + postcss: 8.4.38 dev: false - /postcss-load-config@4.0.2(postcss@8.4.35): + /postcss-load-config@4.0.2(postcss@8.4.38): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} peerDependencies: @@ -3207,17 +3389,17 @@ packages: optional: true dependencies: lilconfig: 3.1.1 - postcss: 8.4.35 + postcss: 8.4.38 yaml: 2.4.1 dev: false - /postcss-nested@6.0.1(postcss@8.4.35): + /postcss-nested@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 postcss-selector-parser: 6.0.16 dev: false @@ -3242,13 +3424,13 @@ packages: source-map-js: 1.0.2 dev: false - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: false /prelude-ls@1.2.1: @@ -3256,14 +3438,14 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /prism-react-renderer@2.1.0(react@18.2.0): + /prism-react-renderer@2.1.0(react@18.3.1): resolution: {integrity: sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ==} peerDependencies: react: '>=16.0.0' dependencies: '@types/prismjs': 1.26.3 clsx: 1.2.1 - react: 18.2.0 + react: 18.3.1 dev: false /prismjs@1.29.0: @@ -3290,36 +3472,34 @@ packages: safe-buffer: 5.2.1 dev: false - /react-dom@18.2.0(react@18.2.0): + /react-dom@18.2.0(react@18.3.1): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: react: ^18.2.0 dependencies: loose-envify: 1.4.0 - react: 18.2.0 + react: 18.3.1 scheduler: 0.23.0 dev: false - /react-email@2.1.1(eslint@9.0.0): - resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} + /react-email@2.1.4(eslint@9.0.0): + resolution: {integrity: sha512-YKZ4jhkalWcNyaw4qyI//+QeTeUxe/ptqI+wSc4wVIoHzqffAWoV5x/jBpFex3FQ636xVIDFrvGq39rUVL7zSQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@babel/parser': 7.24.1 + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 '@radix-ui/colors': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) - '@react-email/components': 0.0.16(@types/react@18.2.33)(react@18.2.0) - '@react-email/render': 0.0.12 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-popover': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) + '@radix-ui/react-tooltip': 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0)(react@18.3.1) '@swc/core': 1.3.101 - '@types/react': 18.2.33 - '@types/react-dom': 18.2.14 + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 '@types/webpack': 5.28.5(@swc/core@1.3.101)(esbuild@0.19.11) - autoprefixer: 10.4.14(postcss@8.4.35) - babel-walk: 3.0.0 + autoprefixer: 10.4.14(postcss@8.4.38) chalk: 4.1.2 chokidar: 3.5.3 clsx: 2.1.0 @@ -3328,28 +3508,27 @@ packages: esbuild: 0.19.11 eslint-config-prettier: 9.0.0(eslint@9.0.0) eslint-config-turbo: 1.10.12(eslint@9.0.0) - framer-motion: 10.17.4(react-dom@18.2.0)(react@18.2.0) + framer-motion: 10.17.4(react-dom@18.2.0)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 mime-types: 2.1.35 - next: 14.1.0(react-dom@18.2.0)(react@18.2.0) + next: 14.1.4(@babel/core@7.24.5)(react-dom@18.2.0)(react@18.3.1) normalize-path: 3.0.0 ora: 5.4.1 - postcss: 8.4.35 - prism-react-renderer: 2.1.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + postcss: 8.4.38 + prism-react-renderer: 2.1.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) shelljs: 0.8.5 socket.io: 4.7.3 socket.io-client: 4.7.3 - sonner: 1.3.1(react-dom@18.2.0)(react@18.2.0) + sonner: 1.3.1(react-dom@18.2.0)(react@18.3.1) source-map-js: 1.0.2 stacktrace-parser: 0.1.10 tailwind-merge: 2.2.0 tailwindcss: 3.4.0 typescript: 5.1.6 transitivePeerDependencies: - - '@babel/core' - '@opentelemetry/api' - '@swc/helpers' - babel-plugin-macros @@ -3363,7 +3542,13 @@ packages: - webpack-cli dev: false - /react-remove-scroll-bar@2.3.6(@types/react@18.2.33)(react@18.2.0): + /react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + dependencies: + fast-deep-equal: 2.0.1 + dev: false + + /react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: @@ -3373,13 +3558,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.3.3 + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.33)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -3389,16 +3574,16 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 - react: 18.2.0 - react-remove-scroll-bar: 2.3.6(@types/react@18.2.33)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.3.3 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.2.33)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.33)(react@18.2.0) + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -3408,15 +3593,15 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.3.3 get-nonce: 1.0.1 invariant: 2.2.4 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 dev: false - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 @@ -3513,6 +3698,11 @@ packages: parseley: 0.12.1 dev: false + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + /semver@7.6.0: resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} @@ -3610,14 +3800,14 @@ packages: - utf-8-validate dev: false - /sonner@1.3.1(react-dom@18.2.0)(react@18.2.0): + /sonner@1.3.1(react-dom@18.2.0)(react@18.3.1): resolution: {integrity: sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) dev: false /source-map-js@1.0.2: @@ -3625,6 +3815,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: false + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -3692,7 +3887,7 @@ packages: engines: {node: '>=8'} dev: false - /styled-jsx@5.1.1(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -3705,8 +3900,9 @@ packages: babel-plugin-macros: optional: true dependencies: + '@babel/core': 7.24.5 client-only: 0.0.1 - react: 18.2.0 + react: 18.3.1 dev: false /sucrase@3.35.0: @@ -3723,6 +3919,13 @@ packages: ts-interface-checker: 0.1.13 dev: false + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3767,11 +3970,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.35 - postcss-import: 15.1.0(postcss@8.4.35) - postcss-js: 4.0.1(postcss@8.4.35) - postcss-load-config: 4.0.2(postcss@8.4.35) - postcss-nested: 6.0.1(postcss@8.4.35) + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) postcss-selector-parser: 6.0.16 resolve: 1.22.8 sucrase: 3.35.0 @@ -3897,7 +4100,7 @@ packages: punycode: 2.3.1 dev: false - /use-callback-ref@1.3.2(@types/react@18.2.33)(react@18.2.0): + /use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: @@ -3907,12 +4110,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 - react: 18.2.0 + '@types/react': 18.3.3 + react: 18.3.1 tslib: 2.6.2 dev: false - /use-sidecar@1.1.2(@types/react@18.2.33)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -3922,9 +4125,9 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.33 + '@types/react': 18.3.3 detect-node-es: 1.1.0 - react: 18.2.0 + react: 18.3.1 tslib: 2.6.2 dev: false @@ -4044,6 +4247,10 @@ packages: engines: {node: '>=0.4.0'} dev: false + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false diff --git a/utils/email-templates-builder/tailwind.config.ts b/utils/email-templates-builder/tailwind.config.ts new file mode 100644 index 000000000..68cf2cd53 --- /dev/null +++ b/utils/email-templates-builder/tailwind.config.ts @@ -0,0 +1,60 @@ +import type { TailwindConfig } from "@react-email/tailwind"; + +export default { + theme: { + extend: { + fontSize: { + xs: ["12px", { lineHeight: "16px" }], + sm: ["14px", { lineHeight: "20px" }], + base: ["16px", { lineHeight: "24px" }], + lg: ["18px", { lineHeight: "28px" }], + xl: ["20px", { lineHeight: "28px" }], + "2xl": ["24px", { lineHeight: "32px" }], + "3xl": ["30px", { lineHeight: "36px" }], + "4xl": ["36px", { lineHeight: "36px" }], + "5xl": ["48px", { lineHeight: "1" }], + "6xl": ["60px", { lineHeight: "1" }], + "7xl": ["72px", { lineHeight: "1" }], + "8xl": ["96px", { lineHeight: "1" }], + "9xl": ["144px", { lineHeight: "1" }], + }, + spacing: { + px: "1px", + 0: "0", + 0.5: "2px", + 1: "4px", + 1.5: "6px", + 2: "8px", + 2.5: "10px", + 3: "12px", + 3.5: "14px", + 4: "16px", + 5: "20px", + 6: "24px", + 7: "28px", + 8: "32px", + 9: "36px", + 10: "40px", + 11: "44px", + 12: "48px", + 14: "56px", + 16: "64px", + 20: "80px", + 24: "96px", + 28: "112px", + 32: "128px", + 36: "144px", + 40: "160px", + 44: "176px", + 48: "192px", + 52: "208px", + 56: "224px", + 60: "240px", + 64: "256px", + 72: "288px", + 80: "320px", + 96: "384px", + }, + } + }, +} satisfies TailwindConfig; diff --git a/web/public/logo.png b/web/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1337c70e1ed59ae6b2b54cb940fe6dc941e7a9 GIT binary patch literal 16135 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 NQdCZ)O2{Da{{iv6F3tb| literal 0 HcmV?d00001 From 790e4a44562f69a73f97ff53a5032ed693681d0c Mon Sep 17 00:00:00 2001 From: Ion Dormenco Date: Tue, 28 May 2024 11:48:16 +0300 Subject: [PATCH 3/4] fix build --- .../EmailTemplating/Generators/ResetPasswordEmailGenerator.cs | 2 +- .../Services/EmailTemplating/Props/ConfirmEmailProps.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs index 51f817d9b..8255a8f55 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Generators/ResetPasswordEmailGenerator.cs @@ -12,7 +12,7 @@ public EmailModel Generate(ResetPasswordEmailProps props) var body = template .Replace("~$name$~", props.FullName) .Replace("~$resetPasswordUrl$~", props.ResetPasswordUrl) - .Replace("~$cdnUrl$~", props.CdnUrl) + .Replace("~$cdnUrl$~", props.CdnUrl); return new EmailModel("Reset your password on VoteMonitor Platform", body); } diff --git a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ConfirmEmailProps.cs b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ConfirmEmailProps.cs index e73a0829d..ca1608bd8 100644 --- a/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ConfirmEmailProps.cs +++ b/api/src/Vote.Monitor.Core/Services/EmailTemplating/Props/ConfirmEmailProps.cs @@ -1,3 +1,3 @@ namespace Vote.Monitor.Core.Services.EmailTemplating.Props; -public record ConfirmEmailProps(string CdnUrl, string Email, string ConfirmUrl) : BaseEmailProps(CdnUrl); +public record ConfirmEmailProps(string CdnUrl, string FullName, string ConfirmUrl) : BaseEmailProps(CdnUrl); From 6d1e9907bc87867cc9403b50e7920a58ec7a1c9d Mon Sep 17 00:00:00 2001 From: Ion Dormenco Date: Tue, 28 May 2024 13:01:51 +0300 Subject: [PATCH 4/4] Cleanup --- .../Feature.Attachments/CreateV2/Endpoint.cs | 78 ------------------- .../Feature.Attachments/CreateV2/Request.cs | 19 ----- .../Feature.Attachments/CreateV2/Result.cs | 11 --- .../Feature.Attachments/CreateV2/Validator.cs | 16 ---- .../Contracts/IFileStorageService.cs | 1 - .../Contracts/PresignedUploadLinkResult.cs | 9 --- .../LocalDisk/LocalDiskFileStorageService.cs | 5 -- .../FileStorage/S3/S3FileStorageService.cs | 25 ------ 8 files changed, 164 deletions(-) delete mode 100644 api/src/Feature.Attachments/CreateV2/Endpoint.cs delete mode 100644 api/src/Feature.Attachments/CreateV2/Request.cs delete mode 100644 api/src/Feature.Attachments/CreateV2/Result.cs delete mode 100644 api/src/Feature.Attachments/CreateV2/Validator.cs delete mode 100644 api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs diff --git a/api/src/Feature.Attachments/CreateV2/Endpoint.cs b/api/src/Feature.Attachments/CreateV2/Endpoint.cs deleted file mode 100644 index 91be0bac6..000000000 --- a/api/src/Feature.Attachments/CreateV2/Endpoint.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System.Net; -using Authorization.Policies.Requirements; -using Feature.Attachments.Specifications; -using Microsoft.AspNetCore.Authorization; -using Vote.Monitor.Core.Services.FileStorage.Contracts; -using Vote.Monitor.Domain.Entities.MonitoringObserverAggregate; - -namespace Feature.Attachments.CreateV2; - -public class Endpoint( - IAuthorizationService authorizationService, - IRepository repository, - IFileStorageService fileStorageService, - IReadRepository monitoringObserverRepository) - : Endpoint, NotFound, BadRequest, StatusCodeHttpResult>> -{ - public override void Configure() - { - Post("/api/election-rounds/{electionRoundId}/attachments:v2"); - DontAutoTag(); - Options(x => x.WithTags("attachments", "mobile")); - AllowFileUploads(); - Summary(s => - { - s.Summary = "Uploads an attachment for a specific polling station"; - }); - } - - public override async Task, NotFound, BadRequest, StatusCodeHttpResult>> ExecuteAsync(Request req, CancellationToken ct) - { - var authorizationResult = await authorizationService.AuthorizeAsync(User, new MonitoringObserverRequirement(req.ElectionRoundId)); - if (!authorizationResult.Succeeded) - { - return TypedResults.NotFound(); - } - var monitoringObserverSpecification = new GetMonitoringObserverSpecification(req.ElectionRoundId, req.ObserverId); - var monitoringObserver = await monitoringObserverRepository.FirstOrDefaultAsync(monitoringObserverSpecification, ct); - - if (monitoringObserver == null) - { - AddError(r => r.ObserverId, "Observer not found"); - return TypedResults.BadRequest(new ProblemDetails(ValidationFailures)); - } - - var uploadPath = $"elections/{req.ElectionRoundId}/polling-stations/{req.PollingStationId}/form/{req.FormId}/attachments"; - - var attachment = new AttachmentAggregate(req.Id, - req.ElectionRoundId, - req.PollingStationId, - monitoringObserver.Id, - req.FormId, - req.QuestionId, - req.FileName, - uploadPath, - req.ContentType); - - var getPresignedUploadUrlResult = await fileStorageService.GetPresignedUploadLinkAsync(uploadPath, fileName: attachment.UploadedFileName, ct); - - if (getPresignedUploadUrlResult is PresignedUploadLinkResult.Failed) - { - return TypedResults.StatusCode((int)HttpStatusCode.InternalServerError); - } - - await repository.AddAsync(attachment, ct); - - var result = getPresignedUploadUrlResult as PresignedUploadLinkResult.Ok; - - return TypedResults.Ok(new Result - { - Id = attachment.Id, - PresignedUrl = result!.Url, - UrlValidityInSeconds = result.UrlValidityInSeconds, - FormId = attachment.FormId, - PollingStationId = attachment.PollingStationId, - QuestionId = attachment.QuestionId, - }); - } -} diff --git a/api/src/Feature.Attachments/CreateV2/Request.cs b/api/src/Feature.Attachments/CreateV2/Request.cs deleted file mode 100644 index 727fb1362..000000000 --- a/api/src/Feature.Attachments/CreateV2/Request.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Vote.Monitor.Core.Security; - -namespace Feature.Attachments.CreateV2; - -public class Request -{ - public Guid ElectionRoundId { get; set; } - - public Guid PollingStationId { get; set; } - - [FromClaim(ApplicationClaimTypes.UserId)] - public Guid ObserverId { get; set; } - - public Guid Id { get; set; } - public Guid FormId { get; set; } - public Guid QuestionId { get; set; } - public string FileName { get; set; } - public string ContentType { get; set; } -} diff --git a/api/src/Feature.Attachments/CreateV2/Result.cs b/api/src/Feature.Attachments/CreateV2/Result.cs deleted file mode 100644 index f4277b2fb..000000000 --- a/api/src/Feature.Attachments/CreateV2/Result.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Feature.Attachments.CreateV2; - -public class Result -{ - public Guid Id { get; set; } - public string PresignedUrl { get; set; } - public int UrlValidityInSeconds { get; set; } - public Guid FormId { get; set; } - public Guid PollingStationId { get; set; } - public Guid QuestionId { get; set; } -} diff --git a/api/src/Feature.Attachments/CreateV2/Validator.cs b/api/src/Feature.Attachments/CreateV2/Validator.cs deleted file mode 100644 index 6f8afa163..000000000 --- a/api/src/Feature.Attachments/CreateV2/Validator.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Vote.Monitor.Core.Validators; - -namespace Feature.Attachments.CreateV2; - -public class Validator : Validator -{ - public Validator() - { - RuleFor(x => x.ElectionRoundId).NotEmpty(); - RuleFor(x => x.PollingStationId).NotEmpty(); - RuleFor(x => x.ObserverId).NotEmpty(); - RuleFor(x => x.Id).NotEmpty(); - RuleFor(x => x.FormId).NotEmpty(); - RuleFor(x => x.QuestionId).NotEmpty(); - } -} diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs index 6c93b9a0a..6463816a9 100644 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/IFileStorageService.cs @@ -2,7 +2,6 @@ public interface IFileStorageService { - Task GetPresignedUploadLinkAsync(string uploadPath, string fileName, CancellationToken ct = default); Task UploadFileAsync(string uploadPath, string fileName, Stream stream, CancellationToken ct = default); Task GetPresignedUrlAsync(string uploadPath, string fileName, CancellationToken ct = default); } diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs deleted file mode 100644 index e50bcfdb1..000000000 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/Contracts/PresignedUploadLinkResult.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Vote.Monitor.Core.Services.FileStorage.Contracts; - -public abstract record PresignedUploadLinkResult -{ - public record Ok(string Url, int UrlValidityInSeconds) : PresignedUploadLinkResult; - public record Failed(string ErrorMessage) : PresignedUploadLinkResult; - - private PresignedUploadLinkResult() { } -} diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs index b1ddfcc03..b57ec6e1a 100644 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/LocalDisk/LocalDiskFileStorageService.cs @@ -16,11 +16,6 @@ public LocalDiskFileStorageService(IOptions options, ILogger GetPresignedUploadLinkAsync(string uploadPath, string fileName, CancellationToken ct = default) - { - return Task.FromResult(new PresignedUploadLinkResult.Ok(_options.Path, UrlValidityInSeconds)); - } - public async Task UploadFileAsync(string uploadPath, string filename, Stream stream, CancellationToken ct = default) { try diff --git a/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs b/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs index 834a57378..2d070950e 100644 --- a/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs +++ b/api/src/Vote.Monitor.Core/Services/FileStorage/S3/S3FileStorageService.cs @@ -12,31 +12,6 @@ internal class S3FileStorageService(IAmazonS3 client, ILogger GetPresignedUploadLinkAsync(string uploadPath, string fileName, CancellationToken ct = default) - { - GetPreSignedUrlRequest request = new GetPreSignedUrlRequest - { - BucketName = _options.BucketName, - Key = GetFileKey(uploadPath, fileName), - Verb = HttpVerb.PUT, - Expires = DateTime.Now.AddSeconds(_options.PresignedUrlValidityInSeconds) - }; - - try - { - var urlString = await client.GetPreSignedURLAsync(request); - - return new PresignedUploadLinkResult.Ok(urlString, _options.PresignedUrlValidityInSeconds); - } - catch (AmazonS3Exception ex) - { - SentrySdk.CaptureException(ex); - logger.LogError(ex, "Failed to generate presigned Url in S3 for {uploadPath} {fileName}", uploadPath, fileName); - } - - return new PresignedUploadLinkResult.Failed("Failed to generate presigned Url"); - } - public async Task UploadFileAsync(string uploadPath, string fileName, Stream stream, CancellationToken ct = default) { var request = new PutObjectRequest