Merge branch 'v13/dev' into release/13.0
# Conflicts: # src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/details.html
@@ -45,13 +45,9 @@
|
||||
<body ng-class="{'touch':touchDevice, 'emptySection':emptySection, 'umb-drawer-is-visible':drawer.show, 'umb-tour-is-visible': tour.show, 'tabbing-active':tabbingActive}" ng-controller="Umbraco.MainController" id="umbracoMainPageBody">
|
||||
<noscript>
|
||||
<div class="flex flex-wrap flex-column items-center justify-center" style="height: 100%">
|
||||
<h1 class="h3">
|
||||
<span style="width: 30px; height: 30px; vertical-align: text-bottom" class="flex-inline">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 315.89 315.89" fill="#3544b1">
|
||||
<path d="M0,157.74A157.95,157.95,0,1,1,158,315.89,157.95,157.95,0,0,1,0,157.74Zm154.74,54.09a155.41,155.41,0,0,1-36.5-3.29,27.92,27.92,0,0,1-19.94-16q-5.35-12.34-5.21-38.1a243,243,0,0,1,1.69-26.84q1.55-13,3.09-21.46l1.07-5.59a2,2,0,0,0,0-.49,3.2,3.2,0,0,0-2.65-3.17L75.92,93.67h-.44a3.19,3.19,0,0,0-3.11,2.48c-.35,1.31-.56,2.27-1.17,5.38-1.16,6-2.24,11.85-3.43,20.38a264.17,264.17,0,0,0-2.3,27.94,145.24,145.24,0,0,0,0,19.57q.72,25.94,8.9,41.42t27.72,22.3q19.53,6.81,54.43,6.66h2.91q34.94.15,54.41-6.66t27.71-22.3q8.17-15.53,8.91-41.42a145.24,145.24,0,0,0,0-19.57,266.84,266.84,0,0,0-2.3-27.94c-1.2-8.44-2.27-14.26-3.44-20.38-.61-3.11-.81-4.07-1.16-5.38a3.21,3.21,0,0,0-3.12-2.48h-.52l-20.38,3.18a3.2,3.2,0,0,0-2.68,3.17,4,4,0,0,0,0,.49l1.08,5.59q1.55,8.48,3.12,21.46a245.68,245.68,0,0,1,1.65,26.84q.27,25.69-5.21,38.07a27.9,27.9,0,0,1-19.76,16.07,155.19,155.19,0,0,1-36.48,3.29Z" />
|
||||
</svg>
|
||||
</span>
|
||||
Umbraco
|
||||
<h1 class="h3" style="display: inline-flex; align-items: center; gap: 10px">
|
||||
<img aria-hidden="true" alt="logo" src="~/umbraco/assets/img/application/logo.svg" style="width: 30px" />
|
||||
<span>Umbraco</span>
|
||||
</h1>
|
||||
<p>For full functionality of Umbraco CMS it is necessary to enable JavaScript.</p>
|
||||
<p>Here are the <a href="https://www.enable-javascript.com/" target="_blank" rel="noopener" style="text-decoration: underline;">instructions how to enable JavaScript in your web browser</a>.</p>
|
||||
@@ -113,6 +109,7 @@
|
||||
<umb-editors ng-show="infiniteMode"></umb-editors>
|
||||
|
||||
<umb-login ng-if="login.show"
|
||||
is-timed-out="login.isTimedOut"
|
||||
on-login="hideLoginScreen()">
|
||||
</umb-login>
|
||||
</umb-backoffice-icon-registry>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
<body ng-class="{loading:installer.loading}" ng-controller="Umbraco.InstallerController" id="umbracoInstallPageBody">
|
||||
|
||||
<img src="assets/img/application/umbraco_logomark_white.svg" width="32" height="32" alt="Umbraco" draggable="false" id="logo" />
|
||||
<img src="assets/img/application/logo_white.svg" aria-hidden="true" width="91" height="91" alt="Umbraco" draggable="false" id="logo" />
|
||||
|
||||
<umb-loader position="bottom"
|
||||
class="umb-installer-loader"
|
||||
|
||||
@@ -4,7 +4,10 @@
|
||||
@using Umbraco.Cms.Core
|
||||
@using Umbraco.Cms.Core.Configuration.Models
|
||||
@using Umbraco.Cms.Core.Hosting
|
||||
@using Umbraco.Cms.Core.Logging
|
||||
@using Umbraco.Cms.Core.Mail
|
||||
@using Umbraco.Cms.Core.WebAssets
|
||||
@using Umbraco.Cms.Infrastructure.WebAssets
|
||||
@using Umbraco.Cms.Web.BackOffice.Controllers
|
||||
@using Umbraco.Cms.Web.BackOffice.Security
|
||||
@using Umbraco.Extensions
|
||||
@@ -13,11 +16,15 @@
|
||||
@inject IEmailSender EmailSender
|
||||
@inject IHostingEnvironment HostingEnvironment
|
||||
@inject IOptions<GlobalSettings> GlobalSettings
|
||||
@inject IRuntimeMinifier RuntimeMinifier
|
||||
@inject IProfilerHtml ProfilerHtml
|
||||
@inject IBackOfficeExternalLoginProviders ExternalLogins
|
||||
@inject LinkGenerator LinkGenerator
|
||||
@{
|
||||
bool.TryParse(Context.Request.Query["umbDebug"], out var isDebug);
|
||||
var backOfficePath = GlobalSettings.Value.GetBackOfficePath(HostingEnvironment);
|
||||
var loginLogoImage = ContentSettings.Value.LoginLogoImage;
|
||||
var loginLogoImageAlternative = ContentSettings.Value.LoginLogoImageAlternative;
|
||||
var loginBackgroundImage = ContentSettings.Value.LoginBackgroundImage;
|
||||
var usernameIsEmail = SecuritySettings.Value.UsernameIsEmail;
|
||||
var allowUserInvite = EmailSender.CanSendRequiredEmail();
|
||||
@@ -30,47 +37,84 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="@CultureInfo.CurrentCulture.Name.ToLowerInvariant()">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<base href="@backOfficePath.EnsureEndsWith('/')"/>
|
||||
<link rel="icon" type="image/svg+xml" href="~/umbraco/login/favicon.svg"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<title>Umbraco</title>
|
||||
<link rel="stylesheet" href="~/umbraco/login/style.css" asp-append-version="true" />
|
||||
<script type="module" src="~/umbraco/login/external.js" asp-append-version="true"></script>
|
||||
<script type="module" src="~/umbraco/login/index.js" asp-append-version="true"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<base href="@backOfficePath.EnsureEndsWith('/')"/>
|
||||
<link rel="icon" type="image/svg+xml" href="~/umbraco/login/favicon.svg"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||
<meta name="robots" content="noindex, nofollow"/>
|
||||
<meta name="pinterest" content="nopin"/>
|
||||
<title>Umbraco</title>
|
||||
|
||||
<body class="uui-font uui-text" style="margin: 0; padding: 0; overflow: hidden">
|
||||
<umb-backoffice-icon-registry>
|
||||
<umb-auth
|
||||
return-url="@backOfficePath"
|
||||
logo-image="@loginLogoImage"
|
||||
background-image="@loginBackgroundImage"
|
||||
username-is-email="@usernameIsEmail"
|
||||
allow-user-invite="@allowUserInvite"
|
||||
allow-password-reset="@allowPasswordReset"
|
||||
disable-local-login="@disableLocalLogin">
|
||||
@foreach (var provider in externalLoginProviders)
|
||||
{
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="@provider.AuthenticationScheme.DisplayName"
|
||||
provider-name="@provider.ExternalLoginProvider.AuthenticationType"
|
||||
icon="@provider.ExternalLoginProvider.Options.Icon"
|
||||
external-login-url="@externalLoginsUrl"
|
||||
button-look="@provider.ExternalLoginProvider.Options.ButtonLook.ToString().ToLowerInvariant()"
|
||||
button-color="@provider.ExternalLoginProvider.Options.ButtonColor.ToString().ToLowerInvariant()"
|
||||
custom-view="@provider.ExternalLoginProvider.Options.CustomBackOfficeView">
|
||||
</umb-external-login-provider>
|
||||
}
|
||||
</umb-auth>
|
||||
</umb-backoffice-icon-registry>
|
||||
</body>
|
||||
@Html.Raw(await RuntimeMinifier.RenderCssHereAsync(BackOfficeWebAssets.UmbracoNonOptimizedPackageCssBundleName))
|
||||
@Html.Raw(await RuntimeMinifier.RenderCssHereAsync(BackOfficeWebAssets.UmbracoCssBundleName))
|
||||
|
||||
<link rel="stylesheet" href="~/umbraco/login/style.css" asp-append-version="true"/>
|
||||
<script type="module" src="~/umbraco/login/external.js" asp-append-version="true"></script>
|
||||
<script type="module" src="~/umbraco/login/index.js" asp-append-version="true"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="uui-font uui-text" style="margin: 0; padding: 0; overflow: hidden">
|
||||
<noscript>
|
||||
<style>
|
||||
#noscript-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
padding: 0 20px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<div id="noscript-container">
|
||||
<h1 class="uui-h3" style="display: inline-flex; align-items: center; gap: 10px">
|
||||
<img aria-hidden="true" alt="logo" src="~/umbraco/assets/img/application/logo.svg" style="width: 30px" />
|
||||
<span>Umbraco</span>
|
||||
</h1>
|
||||
<p>For full functionality of Umbraco CMS it is necessary to enable JavaScript.</p>
|
||||
<p>Here are the <a href="https://www.enable-javascript.com/" target="_blank" rel="noopener" style="text-decoration: underline;">instructions how to enable JavaScript in your web browser</a>.</p>
|
||||
</div>
|
||||
</noscript>
|
||||
|
||||
<umb-backoffice-icon-registry>
|
||||
<umb-auth
|
||||
return-url="@backOfficePath"
|
||||
logo-image="@loginLogoImage"
|
||||
logo-image-alternative="@loginLogoImageAlternative"
|
||||
background-image="@loginBackgroundImage"
|
||||
username-is-email="@usernameIsEmail"
|
||||
allow-user-invite="@allowUserInvite"
|
||||
allow-password-reset="@allowPasswordReset"
|
||||
disable-local-login="@disableLocalLogin">
|
||||
@foreach (var provider in externalLoginProviders)
|
||||
{
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="@provider.AuthenticationScheme.DisplayName"
|
||||
provider-name="@provider.ExternalLoginProvider.AuthenticationType"
|
||||
icon="@provider.ExternalLoginProvider.Options.Icon"
|
||||
external-login-url="@externalLoginsUrl"
|
||||
button-look="@provider.ExternalLoginProvider.Options.ButtonLook.ToString().ToLowerInvariant()"
|
||||
button-color="@provider.ExternalLoginProvider.Options.ButtonColor.ToString().ToLowerInvariant()"
|
||||
custom-view="@provider.ExternalLoginProvider.Options.CustomBackOfficeView">
|
||||
</umb-external-login-provider>
|
||||
}
|
||||
</umb-auth>
|
||||
</umb-backoffice-icon-registry>
|
||||
|
||||
@if (isDebug)
|
||||
{
|
||||
@Html.Raw(ProfilerHtml.Render())
|
||||
}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -25,7 +25,9 @@
|
||||
<section>
|
||||
<article>
|
||||
<div>
|
||||
<div class="logo"></div>
|
||||
<div class="logo" aria-hidden="true">
|
||||
<img alt="Umbraco" src="umbraco/assets/img/application/logo_white.svg" width="91" height="91" />
|
||||
</div>
|
||||
|
||||
<h1>Welcome to your Umbraco installation</h1>
|
||||
<h3>You're seeing this wonderful page because your website doesn't contain any published content yet.</h3>
|
||||
|
||||
@@ -152,8 +152,9 @@ public class ContentSettings
|
||||
internal const string StaticMacroErrors = "Inline";
|
||||
internal const string StaticDisallowedUploadFiles = "ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd,xamlx";
|
||||
internal const bool StaticShowDeprecatedPropertyEditors = false;
|
||||
internal const string StaticLoginBackgroundImage = "assets/img/login.svg";
|
||||
internal const string StaticLoginLogoImage = "assets/img/application/umbraco_logo_white.svg";
|
||||
internal const string StaticLoginBackgroundImage = "assets/img/login.jpg";
|
||||
internal const string StaticLoginLogoImage = "assets/img/application/umbraco_logo_blue.svg";
|
||||
internal const string StaticLoginLogoImageAlternative = "assets/img/application/umbraco_logo_blue.svg";
|
||||
internal const bool StaticHideBackOfficeLogo = false;
|
||||
internal const bool StaticDisableDeleteWhenReferenced = false;
|
||||
internal const bool StaticDisableUnpublishWhenReferenced = false;
|
||||
@@ -219,11 +220,21 @@ public class ContentSettings
|
||||
public string LoginBackgroundImage { get; set; } = StaticLoginBackgroundImage;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value for the path to the login screen logo image.
|
||||
/// Gets or sets a value for the path to the login screen logo image
|
||||
/// shown on top of the background image set in <see cref="LoginBackgroundImage" />.
|
||||
/// </summary>
|
||||
/// <remarks>The alternative version of this logo can be found at <see cref="LoginLogoImageAlternative"/>.</remarks>
|
||||
[DefaultValue(StaticLoginLogoImage)]
|
||||
public string LoginLogoImage { get; set; } = StaticLoginLogoImage;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value for the path to the login screen logo image when shown on top
|
||||
/// of a light background (e.g. in mobile resolutions).
|
||||
/// </summary>
|
||||
/// <remarks>This is the alternative version to the regular logo found at <see cref="LoginLogoImage"/>.</remarks>
|
||||
[DefaultValue(StaticLoginLogoImageAlternative)]
|
||||
public string LoginLogoImageAlternative { get; set; } = StaticLoginLogoImageAlternative;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to hide the backoffice umbraco logo or not.
|
||||
/// </summary>
|
||||
|
||||
@@ -12,13 +12,38 @@ public interface IImageSourceParser
|
||||
/// <param name="dependencies">A list of dependencies.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>Turns src="/media/..." into src="umb://media/..." and adds the corresponding udi to the dependencies.</remarks>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string ToArtifact(string value, ICollection<Udi> dependencies);
|
||||
|
||||
/// <summary>
|
||||
/// Parses an Umbraco property value and produces an artifact property value.
|
||||
/// </summary>
|
||||
/// <param name="value">The property value.</param>
|
||||
/// <param name="dependencies">A list of dependencies.</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>Turns src="/media/..." into src="umb://media/..." and adds the corresponding udi to the dependencies.</remarks>
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
string ToArtifact(string value, ICollection<Udi> dependencies, IContextCache contextCache) => ToArtifact(value, dependencies);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
/// <summary>
|
||||
/// Parses an artifact property value and produces an Umbraco property value.
|
||||
/// </summary>
|
||||
/// <param name="value">The artifact property value.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>Turns umb://media/... into /media/....</remarks>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string FromArtifact(string value);
|
||||
|
||||
/// <summary>
|
||||
/// Parses an artifact property value and produces an Umbraco property value.
|
||||
/// </summary>
|
||||
/// <param name="value">The artifact property value.</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>Turns umb://media/... into /media/....</remarks>
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
string FromArtifact(string value, IContextCache contextCache) => FromArtifact(value);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
}
|
||||
|
||||
@@ -15,13 +15,41 @@ public interface ILocalLinkParser
|
||||
/// Turns {{localLink:1234}} into {{localLink:umb://{type}/{id}}} and adds the corresponding udi to the
|
||||
/// dependencies.
|
||||
/// </remarks>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string ToArtifact(string value, ICollection<Udi> dependencies);
|
||||
|
||||
/// <summary>
|
||||
/// Parses an Umbraco property value and produces an artifact property value.
|
||||
/// </summary>
|
||||
/// <param name="value">The property value.</param>
|
||||
/// <param name="dependencies">A list of dependencies.</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>
|
||||
/// Turns {{localLink:1234}} into {{localLink:umb://{type}/{id}}} and adds the corresponding udi to the
|
||||
/// dependencies.
|
||||
/// </remarks>
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
string ToArtifact(string value, ICollection<Udi> dependencies, IContextCache contextCache) => ToArtifact(value, dependencies);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
/// <summary>
|
||||
/// Parses an artifact property value and produces an Umbraco property value.
|
||||
/// </summary>
|
||||
/// <param name="value">The artifact property value.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>Turns {{localLink:umb://{type}/{id}}} into {{localLink:1234}}.</remarks>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string FromArtifact(string value);
|
||||
|
||||
/// <summary>
|
||||
/// Parses an artifact property value and produces an Umbraco property value.
|
||||
/// </summary>
|
||||
/// <param name="value">The artifact property value.</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>The parsed value.</returns>
|
||||
/// <remarks>Turns {{localLink:umb://{type}/{id}}} into {{localLink:1234}}.</remarks>
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
string FromArtifact(string value, IContextCache contextCache) => FromArtifact(value);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
}
|
||||
|
||||
@@ -8,15 +8,38 @@ public interface IMacroParser
|
||||
/// <param name="value">Property value.</param>
|
||||
/// <param name="dependencies">A list of dependencies.</param>
|
||||
/// <returns>Parsed value.</returns>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string ToArtifact(string value, ICollection<Udi> dependencies);
|
||||
|
||||
/// <summary>
|
||||
/// Parses an Umbraco property value and produces an artifact property value.
|
||||
/// </summary>
|
||||
/// <param name="value">Property value.</param>
|
||||
/// <param name="dependencies">A list of dependencies.</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>Parsed value.</returns>
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
string ToArtifact(string value, ICollection<Udi> dependencies, IContextCache contextCache) => ToArtifact(value, dependencies);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
/// <summary>
|
||||
/// Parses an artifact property value and produces an Umbraco property value.
|
||||
/// </summary>
|
||||
/// <param name="value">Artifact property value.</param>
|
||||
/// <returns>Parsed value.</returns>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string FromArtifact(string value);
|
||||
|
||||
/// <summary>
|
||||
/// Parses an artifact property value and produces an Umbraco property value.
|
||||
/// </summary>
|
||||
/// <param name="value">Artifact property value.</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>Parsed value.</returns>
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
string FromArtifact(string value, IContextCache contextCache) => FromArtifact(value);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
/// <summary>
|
||||
/// Tries to replace the value of the attribute/parameter with a value containing a converted identifier.
|
||||
/// </summary>
|
||||
@@ -25,5 +48,20 @@ public interface IMacroParser
|
||||
/// <param name="dependencies">Collection to add dependencies to when performing ToArtifact</param>
|
||||
/// <param name="direction">Indicates which action is being performed (to or from artifact)</param>
|
||||
/// <returns>Value with converted identifiers</returns>
|
||||
[Obsolete("Please use the overload taking all parameters. This method will be removed in Umbraco 14.")]
|
||||
string ReplaceAttributeValue(string value, string editorAlias, ICollection<Udi> dependencies, Direction direction);
|
||||
|
||||
/// <summary>
|
||||
/// Tries to replace the value of the attribute/parameter with a value containing a converted identifier.
|
||||
/// </summary>
|
||||
/// <param name="value">Value to attempt to convert</param>
|
||||
/// <param name="editorAlias">Alias of the editor used for the parameter</param>
|
||||
/// <param name="dependencies">Collection to add dependencies to when performing ToArtifact</param>
|
||||
/// <param name="direction">Indicates which action is being performed (to or from artifact)</param>
|
||||
/// <param name="contextCache">The context cache.</param>
|
||||
/// <returns>Value with converted identifiers</returns>
|
||||
string ReplaceAttributeValue(string value, string editorAlias, ICollection<Udi> dependencies, Direction direction, IContextCache contextCache)
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
=> ReplaceAttributeValue(value, editorAlias, dependencies, direction);
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
}
|
||||
|
||||
@@ -1051,13 +1051,13 @@ Da upravljate svojom web lokacijom, jednostavno otvorite Umbraco backoffice i po
|
||||
<key alias="renewSession">Obnovite sada da sačuvate svoj rad</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Sretna super nedelja</key>
|
||||
<key alias="greeting1">Sretan divan ponedeljak</key>
|
||||
<key alias="greeting2">Sretan specifičan utorak</key>
|
||||
<key alias="greeting3">Sretna divna srijeda</key>
|
||||
<key alias="greeting4">Sretan gromoglasan četvrtak</key>
|
||||
<key alias="greeting5">Sretan zanimljiv petak</key>
|
||||
<key alias="greeting6">Sretna opuštena subota</key>
|
||||
<key alias="greeting0">Dobrodošli</key>
|
||||
<key alias="greeting1">Dobrodošli</key>
|
||||
<key alias="greeting2">Dobrodošli</key>
|
||||
<key alias="greeting3">Dobrodošli</key>
|
||||
<key alias="greeting4">Dobrodošli</key>
|
||||
<key alias="greeting5">Dobrodošli</key>
|
||||
<key alias="greeting6">Dobrodošli</key>
|
||||
<key alias="instruction">Prijavite se ispod</key>
|
||||
<key alias="signInWith">Prijavite se sa</key>
|
||||
<key alias="timeout">Isteklo je vrijeme sesije</key>
|
||||
|
||||
@@ -871,13 +871,13 @@
|
||||
<key alias="renewSession">Obnovte nyní pro uložení práce</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Šťastnou super neděli</key>
|
||||
<key alias="greeting1">Šťastné šílené pondělí</key>
|
||||
<key alias="greeting2">Šťastné husté úterý</key>
|
||||
<key alias="greeting3">Šťastnou překrásnou středu</key>
|
||||
<key alias="greeting4">Šťastný bouřlivý čtvrtek</key>
|
||||
<key alias="greeting5">Šťastný bláznivý pátek</key>
|
||||
<key alias="greeting6">Šťastnou kočkobotu</key>
|
||||
<key alias="greeting0">Vítejte</key>
|
||||
<key alias="greeting1">Vítejte</key>
|
||||
<key alias="greeting2">Vítejte</key>
|
||||
<key alias="greeting3">Vítejte</key>
|
||||
<key alias="greeting4">Vítejte</key>
|
||||
<key alias="greeting5">Vítejte</key>
|
||||
<key alias="greeting6">Vítejte</key>
|
||||
<key alias="instruction">přihlašte se níže</key>
|
||||
<key alias="signInWith">Přihlásit se pomocí</key>
|
||||
<key alias="timeout">Relace vypršela</key>
|
||||
|
||||
@@ -596,7 +596,7 @@
|
||||
<key alias="indexCannotRebuild">Ni ellir ailadeiladu'r mynegai hwn oherwydd nad yw wedi'i aseinio</key>
|
||||
<key alias="iIndexPopulator">IIndexPopulator</key>
|
||||
|
||||
|
||||
|
||||
<key alias="contentInIndex">Cynnwys yn y mynegai</key>
|
||||
<key alias="noResults">Ni ddarganfuwyd unrhyw ganlyniadau</key>
|
||||
<key alias="searchResultsFound">Dangos %0% - %1% o %2% canlyniad(au) - Tudalen %3% o %4%</key>
|
||||
@@ -1051,13 +1051,13 @@ Er mwyn gweinyddu eich gwefan, agorwch swyddfa gefn Umbraco a dechreuwch ychwang
|
||||
<key alias="renewSession">Adnewyddwch rwan er mwyn achub eich gwaith</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Dydd Sul Swmpus</key>
|
||||
<key alias="greeting1">Dydd Llun Llwyddiannus</key>
|
||||
<key alias="greeting2">Dydd Mawrth Moethus</key>
|
||||
<key alias="greeting3">Dydd Mercher Melys</key>
|
||||
<key alias="greeting4">Dydd Iau Iachus</key>
|
||||
<key alias="greeting5">Dydd Gwener Gwych</key>
|
||||
<key alias="greeting6">Dydd Sadwrn Syfrdannus</key>
|
||||
<key alias="greeting0">Croeso</key>
|
||||
<key alias="greeting1">Croeso</key>
|
||||
<key alias="greeting2">Croeso</key>
|
||||
<key alias="greeting3">Croeso</key>
|
||||
<key alias="greeting4">Croeso</key>
|
||||
<key alias="greeting5">Croeso</key>
|
||||
<key alias="greeting6">Croeso</key>
|
||||
<key alias="instruction">Mewngofnodwch isod</key>
|
||||
<key alias="signInWith">Mewngofnodwch gyda</key>
|
||||
<key alias="timeout">Sesiwn wedi cyrraedd terfyn amser</key>
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
<key alias="editDictionary">Rediger ordbogsnøgle</key>
|
||||
<key alias="editLanguage">Rediger sprog</key>
|
||||
<key alias="editSelectedMedia">Rediger det valgte medie</key>
|
||||
<key alias="editWebhook">Edit webhook</key>
|
||||
<key alias="editWebhook">Edit webhook</key>
|
||||
<key alias="insertAnchor">Indsæt lokalt link</key>
|
||||
<key alias="insertCharacter">Indsæt tegn</key>
|
||||
<key alias="insertgraphicheadline">Indsæt grafisk overskrift</key>
|
||||
@@ -1024,13 +1024,13 @@
|
||||
<key alias="renewSession">Forny for at gemme dine ændringer</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Så er det søndag!</key>
|
||||
<key alias="greeting1">Smil, det er mandag!</key>
|
||||
<key alias="greeting2">Hurra, det er tirsdag!</key>
|
||||
<key alias="greeting3">Hvilken herlig onsdag!</key>
|
||||
<key alias="greeting4">Glædelig torsdag!</key>
|
||||
<key alias="greeting5">Endelig fredag!</key>
|
||||
<key alias="greeting6">Glædelig lørdag</key>
|
||||
<key alias="greeting0">Velkommen</key>
|
||||
<key alias="greeting1">Velkommen</key>
|
||||
<key alias="greeting2">Velkommen</key>
|
||||
<key alias="greeting3">Velkommen</key>
|
||||
<key alias="greeting4">Velkommen</key>
|
||||
<key alias="greeting5">Velkommen</key>
|
||||
<key alias="greeting6">Velkommen</key>
|
||||
<key alias="instruction">Log ind nedenfor</key>
|
||||
<key alias="signInWith">Log ind med</key>
|
||||
<key alias="timeout">Din session er udløbet</key>
|
||||
|
||||
@@ -1054,13 +1054,13 @@
|
||||
<key alias="renewSession">Erneuern Sie, um Ihre Arbeit zu speichern ...</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Einen wunderbaren Sonntag</key>
|
||||
<key alias="greeting1">Schönen Montag</key>
|
||||
<key alias="greeting2">Einen großartigen Dienstag</key>
|
||||
<key alias="greeting3">Wunderbaren Mittwoch</key>
|
||||
<key alias="greeting4">Donnerwetter Donnerstag</key>
|
||||
<key alias="greeting5">Frohen freundlichen Freitag</key>
|
||||
<key alias="greeting6">Wunderbaren sonnigen Samstag</key>
|
||||
<key alias="greeting0">Willkommen</key>
|
||||
<key alias="greeting1">Willkommen</key>
|
||||
<key alias="greeting2">Willkommen</key>
|
||||
<key alias="greeting3">Willkommen</key>
|
||||
<key alias="greeting4">Willkommen</key>
|
||||
<key alias="greeting5">Willkommen</key>
|
||||
<key alias="greeting6">Willkommen</key>
|
||||
<key alias="instruction">Hier anmelden:</key>
|
||||
<key alias="signInWith">Anmelden mit</key>
|
||||
<key alias="timeout">Sitzung abgelaufen</key>
|
||||
|
||||
@@ -1067,13 +1067,13 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
|
||||
<key alias="renewSession">Renew now to save your work</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Happy super Sunday</key>
|
||||
<key alias="greeting1">Happy marvelous Monday</key>
|
||||
<key alias="greeting2">Happy tubular Tuesday</key>
|
||||
<key alias="greeting3">Happy wonderful Wednesday</key>
|
||||
<key alias="greeting4">Happy thunderous Thursday</key>
|
||||
<key alias="greeting5">Happy funky Friday</key>
|
||||
<key alias="greeting6">Happy Caturday</key>
|
||||
<key alias="greeting0">Welcome</key>
|
||||
<key alias="greeting1">Welcome</key>
|
||||
<key alias="greeting2">Welcome</key>
|
||||
<key alias="greeting3">Welcome</key>
|
||||
<key alias="greeting4">Welcome</key>
|
||||
<key alias="greeting5">Welcome</key>
|
||||
<key alias="greeting6">Welcome</key>
|
||||
<key alias="instruction">Log in below</key>
|
||||
<key alias="signInWith">Sign in with</key>
|
||||
<key alias="timeout">Session timed out</key>
|
||||
|
||||
@@ -1096,13 +1096,13 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
|
||||
<key alias="renewSession">Renew now to save your work</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Happy super Sunday</key>
|
||||
<key alias="greeting1">Happy marvelous Monday</key>
|
||||
<key alias="greeting2">Happy tubular Tuesday</key>
|
||||
<key alias="greeting3">Happy wonderful Wednesday</key>
|
||||
<key alias="greeting4">Happy thunderous Thursday</key>
|
||||
<key alias="greeting5">Happy funky Friday</key>
|
||||
<key alias="greeting6">Happy Caturday</key>
|
||||
<key alias="greeting0">Welcome</key>
|
||||
<key alias="greeting1">Welcome</key>
|
||||
<key alias="greeting2">Welcome</key>
|
||||
<key alias="greeting3">Welcome</key>
|
||||
<key alias="greeting4">Welcome</key>
|
||||
<key alias="greeting5">Welcome</key>
|
||||
<key alias="greeting6">Welcome</key>
|
||||
<key alias="instruction">Log in below</key>
|
||||
<key alias="signInWith">Sign in with</key>
|
||||
<key alias="timeout">Session timed out</key>
|
||||
|
||||
@@ -672,13 +672,13 @@
|
||||
<key alias="renewSession">Renovar tu sesión para guardar sus cambios</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Feliz super domingo</key>
|
||||
<key alias="greeting1">Feliz lunes</key>
|
||||
<key alias="greeting2">Tremendo martes</key>
|
||||
<key alias="greeting3">Maravilloso miércoles</key>
|
||||
<key alias="greeting4">Fantástico jueves</key>
|
||||
<key alias="greeting5">¡Ya es viernes!</key>
|
||||
<key alias="greeting6">Resplandeciente sábado</key>
|
||||
<key alias="greeting0">Bienvenido</key>
|
||||
<key alias="greeting1">Bienvenido</key>
|
||||
<key alias="greeting2">Bienvenido</key>
|
||||
<key alias="greeting3">Bienvenido</key>
|
||||
<key alias="greeting4">Bienvenido</key>
|
||||
<key alias="greeting5">Bienvenido</key>
|
||||
<key alias="greeting6">Bienvenido</key>
|
||||
<key alias="instruction">Iniciar sesión</key>
|
||||
<key alias="timeout">La sesión ha caducado</key>
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p> ]]></key>
|
||||
|
||||
@@ -892,13 +892,13 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à
|
||||
<key alias="renewSession">Renouvellez votre session maintenant pour sauvegarder votre travail</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Joyeux dimanche détonnant</key>
|
||||
<key alias="greeting1">Joyeux lundi lumineux</key>
|
||||
<key alias="greeting2">Joyeux mardi magique</key>
|
||||
<key alias="greeting3">Joyeux mercredi merveilleux</key>
|
||||
<key alias="greeting4">Joyeux jeudi</key>
|
||||
<key alias="greeting5">Joyeux vendredi</key>
|
||||
<key alias="greeting6">Joyeux chamedi</key>
|
||||
<key alias="greeting0">Bienvenue</key>
|
||||
<key alias="greeting1">Bienvenue</key>
|
||||
<key alias="greeting2">Bienvenue</key>
|
||||
<key alias="greeting3">Bienvenue</key>
|
||||
<key alias="greeting4">Bienvenue</key>
|
||||
<key alias="greeting5">Bienvenue</key>
|
||||
<key alias="greeting6">Bienvenue</key>
|
||||
<key alias="instruction">Connectez-vous ci-dessous</key>
|
||||
<key alias="signInWith">Identifiez-vous avec</key>
|
||||
<key alias="timeout">La session a expiré</key>
|
||||
|
||||
@@ -453,6 +453,13 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
|
||||
<key alias="renewSession">יש לבצע חידוש פעילות על מנת לשמור על התוכן</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">ברוכים הבאים</key>
|
||||
<key alias="greeting1">ברוכים הבאים</key>
|
||||
<key alias="greeting2">ברוכים הבאים</key>
|
||||
<key alias="greeting3">ברוכים הבאים</key>
|
||||
<key alias="greeting4">ברוכים הבאים</key>
|
||||
<key alias="greeting5">ברוכים הבאים</key>
|
||||
<key alias="greeting6">ברוכים הבאים</key>
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p> ]]></key>
|
||||
</area>
|
||||
<area alias="main">
|
||||
|
||||
@@ -1041,13 +1041,13 @@ Da bi upravljali svojom web lokacijom, jednostavno otvorite Umbraco backoffice i
|
||||
<key alias="renewSession">Obnovite sada da sačuvate svoj rad</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Sretna super nedelja</key>
|
||||
<key alias="greeting1">Sretan divan ponedeljak</key>
|
||||
<key alias="greeting2">Sretan specifičan utorak</key>
|
||||
<key alias="greeting3">Sretna divna srijeda</key>
|
||||
<key alias="greeting4">Sretan gromoglasan četvrtak</key>
|
||||
<key alias="greeting5">Sretan zanimljiv petak</key>
|
||||
<key alias="greeting6">Sretna opuštena subota</key>
|
||||
<key alias="greeting0">Dobrodošli</key>
|
||||
<key alias="greeting1">Dobrodošli</key>
|
||||
<key alias="greeting2">Dobrodošli</key>
|
||||
<key alias="greeting3">Dobrodošli</key>
|
||||
<key alias="greeting4">Dobrodošli</key>
|
||||
<key alias="greeting5">Dobrodošli</key>
|
||||
<key alias="greeting6">Dobrodošli</key>
|
||||
<key alias="instruction">Prijavite se u nastavku</key>
|
||||
<key alias="signInWith">Prijav sa</key>
|
||||
<key alias="timeout">Isteklo je vrijeme sesije</key>
|
||||
|
||||
@@ -1074,13 +1074,13 @@ Per gestire il tuo sito web, è sufficiente aprire il backoffice di Umbraco e in
|
||||
<key alias="renewSession">Riconnetti adesso per salvare il tuo lavoro</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0"><![CDATA[Buona Domenica!]]></key>
|
||||
<key alias="greeting1"><![CDATA[Buon Lunedì!]]></key>
|
||||
<key alias="greeting2"><![CDATA[Buon Martedì!]]></key>
|
||||
<key alias="greeting3"><![CDATA[Buon Mercoledì!]]></key>
|
||||
<key alias="greeting4"><![CDATA[Buon Giovedì!]]></key>
|
||||
<key alias="greeting5"><![CDATA[Buon Venerdì!]]></key>
|
||||
<key alias="greeting6"><![CDATA[Buon Sabato!]]></key>
|
||||
<key alias="greeting0">Benvenuto</key>
|
||||
<key alias="greeting1">Benvenuto</key>
|
||||
<key alias="greeting2">Benvenuto</key>
|
||||
<key alias="greeting3">Benvenuto</key>
|
||||
<key alias="greeting4">Benvenuto</key>
|
||||
<key alias="greeting5">Benvenuto</key>
|
||||
<key alias="greeting6">Benvenuto</key>
|
||||
<key alias="instruction">Fai il login qui sotto</key>
|
||||
<key alias="signInWith">Fai il login con</key>
|
||||
<key alias="timeout">Sessione scaduta</key>
|
||||
|
||||
@@ -568,13 +568,13 @@ Runwayをインストールして作られた新しいウェブサイトがど
|
||||
<key alias="renewSession">作業を保存して今すぐ更新</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">ハッピー スーパー日曜日</key>
|
||||
<key alias="greeting1">ハッピー マニアック月曜日</key>
|
||||
<key alias="greeting2">ハッピー最高の火曜日</key>
|
||||
<key alias="greeting3">ハッピー ワンダフル水曜日</key>
|
||||
<key alias="greeting4">ハッピー サンダー木曜日</key>
|
||||
<key alias="greeting5">ハッピー ファンキー金曜日</key>
|
||||
<key alias="greeting6">ハッピー土曜日</key>
|
||||
<key alias="greeting0">ようこそ</key>
|
||||
<key alias="greeting1">ようこそ</key>
|
||||
<key alias="greeting2">ようこそ</key>
|
||||
<key alias="greeting3">ようこそ</key>
|
||||
<key alias="greeting4">ようこそ</key>
|
||||
<key alias="greeting5">ようこそ</key>
|
||||
<key alias="greeting6">ようこそ</key>
|
||||
<key alias="instruction">ウェブサイトにログインします。</key>
|
||||
<key alias="timeout">セッションタイムアウトしました。</key>
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.org</a></p> ]]></key>
|
||||
|
||||
@@ -441,6 +441,13 @@
|
||||
<key alias="renewSession">TRANSLATE ME: 'Renew now to save your work'</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">환영합니다</key>
|
||||
<key alias="greeting1">환영합니다</key>
|
||||
<key alias="greeting2">환영합니다</key>
|
||||
<key alias="greeting3">환영합니다</key>
|
||||
<key alias="greeting4">환영합니다</key>
|
||||
<key alias="greeting5">환영합니다</key>
|
||||
<key alias="greeting6">환영합니다</key>
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p> ]]></key>
|
||||
</area>
|
||||
<area alias="main">
|
||||
|
||||
@@ -474,13 +474,13 @@
|
||||
<key alias="renewSession">Forny innlogging for å lagre</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Da er det søndag!</key>
|
||||
<key alias="greeting1">Smil, det er mandag!</key>
|
||||
<key alias="greeting2">Hurra, det er tirsdag!</key>
|
||||
<key alias="greeting3">For en herlig onsdag!</key>
|
||||
<key alias="greeting4">Gledelig torsdag!</key>
|
||||
<key alias="greeting5">Endelig fredag!</key>
|
||||
<key alias="greeting6">Gledelig lørdag</key>
|
||||
<key alias="greeting0">Velkommen</key>
|
||||
<key alias="greeting1">Velkommen</key>
|
||||
<key alias="greeting2">Velkommen</key>
|
||||
<key alias="greeting3">Velkommen</key>
|
||||
<key alias="greeting4">Velkommen</key>
|
||||
<key alias="greeting5">Velkommen</key>
|
||||
<key alias="greeting6">Velkommen</key>
|
||||
<key alias="instruction">Logg på nedenfor</key>
|
||||
<key alias="signInWith">Logg på med</key>
|
||||
<key alias="timeout">Din sesjon er utløpt</key>
|
||||
|
||||
@@ -978,13 +978,13 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je
|
||||
<key alias="renewSession">Vernieuw je sessie om je wijzigingen te behouden</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Fijne super zondag</key>
|
||||
<key alias="greeting1">Fijne manische maandag</key>
|
||||
<key alias="greeting2">Fijne dinsdag</key>
|
||||
<key alias="greeting3">Fijne geweldige woensdag</key>
|
||||
<key alias="greeting4">Fijne donderende donderdag</key>
|
||||
<key alias="greeting5">Fijne funky vrijdag</key>
|
||||
<key alias="greeting6">Fijne zaterdag</key>
|
||||
<key alias="greeting0">Welkom</key>
|
||||
<key alias="greeting1">Welkom</key>
|
||||
<key alias="greeting2">Welkom</key>
|
||||
<key alias="greeting3">Welkom</key>
|
||||
<key alias="greeting4">Welkom</key>
|
||||
<key alias="greeting5">Welkom</key>
|
||||
<key alias="greeting6">Welkom</key>
|
||||
<key alias="instruction">log hieronder in</key>
|
||||
<key alias="signInWith">Inloggen met</key>
|
||||
<key alias="timeout">Sessie is verlopen</key>
|
||||
|
||||
@@ -683,13 +683,13 @@ Naciśnij przycisk <strong>instaluj</strong>, aby zainstalować bazę danych Umb
|
||||
<key alias="renewSession">Wznów sesję teraz, aby zapisać swoją pracę</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Szczęśliwej super niedzieli</key>
|
||||
<key alias="greeting1">Szczęśliwego maniakalnego poniedziałku </key>
|
||||
<key alias="greeting2">Szczęśliwego świetnego wtorku</key>
|
||||
<key alias="greeting3">Szczęśliwej niesamowitej środy</key>
|
||||
<key alias="greeting4">Szczęśliwego wyjątkowego czwartku</key>
|
||||
<key alias="greeting5">Szczęśliwego odjechanego piątku</key>
|
||||
<key alias="greeting6">Szczęśliwej cudownej soboty</key>
|
||||
<key alias="greeting0">Witaj</key>
|
||||
<key alias="greeting1">Witaj</key>
|
||||
<key alias="greeting2">Witaj</key>
|
||||
<key alias="greeting3">Witaj</key>
|
||||
<key alias="greeting4">Witaj</key>
|
||||
<key alias="greeting5">Witaj</key>
|
||||
<key alias="greeting6">Witaj</key>
|
||||
<key alias="instruction">Zaloguj się poniżej</key>
|
||||
<key alias="signInWith">Zaloguj się z</key>
|
||||
<key alias="timeout">Sesja wygasła</key>
|
||||
|
||||
@@ -435,6 +435,13 @@ Pressione <strong>"próximo"</strong> para iniciar o assistente.]]></key>
|
||||
<key alias="renewSession">Renovar agora para salvar seu trabalho</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Bem Vindo(a)</key>
|
||||
<key alias="greeting1">Bem Vindo(a)</key>
|
||||
<key alias="greeting2">Bem Vindo(a)</key>
|
||||
<key alias="greeting3">Bem Vindo(a)</key>
|
||||
<key alias="greeting4">Bem Vindo(a)</key>
|
||||
<key alias="greeting5">Bem Vindo(a)</key>
|
||||
<key alias="greeting6">Bem Vindo(a)</key>
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p> ]]></key>
|
||||
</area>
|
||||
<area alias="main">
|
||||
|
||||
@@ -806,13 +806,13 @@
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p>]]></key>
|
||||
<key alias="greeting0">Сегодня же выходной!</key>
|
||||
<key alias="greeting1">Понедельник — день тяжелый...</key>
|
||||
<key alias="greeting2">Вот уже вторник...</key>
|
||||
<key alias="greeting3">Берегите окружающую среду</key>
|
||||
<key alias="greeting4">Рыбный день</key>
|
||||
<key alias="greeting5">Слава Богу, сегодня пятница!</key>
|
||||
<key alias="greeting6">Понедельник начинается в субботу</key>
|
||||
<key alias="greeting0">Добро пожаловать</key>
|
||||
<key alias="greeting1">Добро пожаловать</key>
|
||||
<key alias="greeting2">Добро пожаловать</key>
|
||||
<key alias="greeting3">Добро пожаловать</key>
|
||||
<key alias="greeting4">Добро пожаловать</key>
|
||||
<key alias="greeting5">Добро пожаловать</key>
|
||||
<key alias="greeting6">Добро пожаловать</key>
|
||||
<key alias="instruction">Укажите имя пользователя и пароль</key>
|
||||
<key alias="timeout">Время сессии истекло</key>
|
||||
<key alias="forgottenPassword">Забыли пароль?</key>
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
</area>
|
||||
<area alias="validation">
|
||||
<key alias="entriesShort"><![CDATA[Minsta %0% poster, kräver <strong>%1%</strong> mer.]]></key>
|
||||
<key alias="entriesExceed"><![CDATA[Max %0% poster, <strong>%1%</strong> för många.]]></key>
|
||||
<key alias="entriesExceed"><![CDATA[Max %0% poster, <strong>%1%</strong> för många.]]></key>
|
||||
</area>
|
||||
<area alias="blueprints">
|
||||
<key alias="createBlueprintFrom"><![CDATA[Skapa en ny innehållsmall för <em>%0%</em>]]></key>
|
||||
@@ -223,7 +223,7 @@
|
||||
<key alias="publishedPendingChanges">Publicerad (osparade ändringar)</key>
|
||||
<key alias="listViewNoContent">Inga undernoder har lagts till</key>
|
||||
<key alias="noChanges">Inga ändringar har gjorts</key>
|
||||
<key alias="notCreated">Ej skapad</key>
|
||||
<key alias="notCreated">Ej skapad</key>
|
||||
</area>
|
||||
<area alias="contentTypeEditor">
|
||||
<key alias="yesDelete">Ja, ta bort</key>
|
||||
@@ -636,13 +636,13 @@
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p> ]]></key>
|
||||
<key alias="greeting0">Happy super Sunday</key>
|
||||
<key alias="greeting1">Happy manic Monday</key>
|
||||
<key alias="greeting2">Happy tremendous Tuesday</key>
|
||||
<key alias="greeting3">Happy wonderful Wednesday</key>
|
||||
<key alias="greeting4">Happy thunderous Thursday</key>
|
||||
<key alias="greeting5">Happy friendly Friday</key>
|
||||
<key alias="greeting6">Happy shiny Saturday</key>
|
||||
<key alias="greeting0">Välkommen</key>
|
||||
<key alias="greeting1">Välkommen</key>
|
||||
<key alias="greeting2">Välkommen</key>
|
||||
<key alias="greeting3">Välkommen</key>
|
||||
<key alias="greeting4">Välkommen</key>
|
||||
<key alias="greeting5">Välkommen</key>
|
||||
<key alias="greeting6">Välkommen</key>
|
||||
<key alias="instruction">Logga in nedan</key>
|
||||
<key alias="signInWith">Logga in med</key>
|
||||
<key alias="timeout">Sessionen har nått sin maxgräns</key>
|
||||
|
||||
@@ -937,13 +937,13 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey
|
||||
<key alias="renewSession">Çalışmanızı kaydetmek için şimdi yenileyin</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">Mutlu Pazarlar</key>
|
||||
<key alias="greeting1">Mutlu manik Pazartesi</key>
|
||||
<key alias="greeting2">Mutlu salı günleri</key>
|
||||
<key alias="greeting3">Harika Çarşamba Günleri</key>
|
||||
<key alias="greeting4">Mutlu, gök gürültülü Perşembe</key>
|
||||
<key alias="greeting5">Mutlu Cuma Günü</key>
|
||||
<key alias="greeting6">Mutlu Yıllar</key>
|
||||
<key alias="greeting0">Hoş geldiniz</key>
|
||||
<key alias="greeting1">Hoş geldiniz</key>
|
||||
<key alias="greeting2">Hoş geldiniz</key>
|
||||
<key alias="greeting3">Hoş geldiniz</key>
|
||||
<key alias="greeting4">Hoş geldiniz</key>
|
||||
<key alias="greeting5">Hoş geldiniz</key>
|
||||
<key alias="greeting6">Hoş geldiniz</key>
|
||||
<key alias="instruction">Aşağıda oturum açın</key>
|
||||
<key alias="signInWith">ile oturum açın</key>
|
||||
<key alias="timeout">Oturum zaman aşımına uğradı</key>
|
||||
|
||||
@@ -806,13 +806,13 @@
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="bottomText"><![CDATA[<p style="text-align:right;">© 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p>]]></key>
|
||||
<key alias="greeting0">Сьогодні ж вихідний!</key>
|
||||
<key alias="greeting1">Гарного і продуктивного понеділка</key>
|
||||
<key alias="greeting2">Ось уже вівторок...</key>
|
||||
<key alias="greeting3">Бережіть довкілля</key>
|
||||
<key alias="greeting4">Скоро п'ятниця</key>
|
||||
<key alias="greeting5">Слава Богу, сьогодні п'ятниця!</key>
|
||||
<key alias="greeting6">Понеділок починається у суботу</key>
|
||||
<key alias="greeting0">Вітаємо</key>
|
||||
<key alias="greeting1">Вітаємо</key>
|
||||
<key alias="greeting2">Вітаємо</key>
|
||||
<key alias="greeting3">Вітаємо</key>
|
||||
<key alias="greeting4">Вітаємо</key>
|
||||
<key alias="greeting5">Вітаємо</key>
|
||||
<key alias="greeting6">Вітаємо</key>
|
||||
<key alias="instruction">Вкажіть ім'я користувача та пароль</key>
|
||||
<key alias="timeout">Час сесії закінчився</key>
|
||||
<key alias="forgottenPassword">Забули пароль?</key>
|
||||
|
||||
@@ -588,13 +588,13 @@
|
||||
<key alias="renewSession">已更新,继续工作。</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">星期一快乐</key>
|
||||
<key alias="greeting1">星期二快乐</key>
|
||||
<key alias="greeting2">星期三快乐</key>
|
||||
<key alias="greeting3">星期四快乐</key>
|
||||
<key alias="greeting4">星期五快乐</key>
|
||||
<key alias="greeting5">星期六快乐</key>
|
||||
<key alias="greeting6">星期天快乐</key>
|
||||
<key alias="greeting0">欢迎</key>
|
||||
<key alias="greeting1">欢迎</key>
|
||||
<key alias="greeting2">欢迎</key>
|
||||
<key alias="greeting3">欢迎</key>
|
||||
<key alias="greeting4">欢迎</key>
|
||||
<key alias="greeting5">欢迎</key>
|
||||
<key alias="greeting6">欢迎</key>
|
||||
<key alias="instruction">在下方登录</key>
|
||||
<key alias="signInWith">登录</key>
|
||||
<key alias="timeout">会话超时</key>
|
||||
|
||||
@@ -579,13 +579,13 @@
|
||||
<key alias="renewSession">已更新,繼續工作。</key>
|
||||
</area>
|
||||
<area alias="login">
|
||||
<key alias="greeting0">超級星期天快樂</key>
|
||||
<key alias="greeting1">瘋狂星期一快樂</key>
|
||||
<key alias="greeting2">熱鬧星期二快樂</key>
|
||||
<key alias="greeting3">美妙星期三快樂</key>
|
||||
<key alias="greeting4">悅耳星期四快樂</key>
|
||||
<key alias="greeting5">時髦星期五快樂</key>
|
||||
<key alias="greeting6">喵喵星期六快樂</key>
|
||||
<key alias="greeting0">歡迎</key>
|
||||
<key alias="greeting1">歡迎</key>
|
||||
<key alias="greeting2">歡迎</key>
|
||||
<key alias="greeting3">歡迎</key>
|
||||
<key alias="greeting4">歡迎</key>
|
||||
<key alias="greeting5">歡迎</key>
|
||||
<key alias="greeting6">歡迎</key>
|
||||
<key alias="instruction">下方登入</key>
|
||||
<key alias="signInWith">登入使用</key>
|
||||
<key alias="timeout">連線時間過了</key>
|
||||
|
||||
@@ -5,4 +5,5 @@ public enum WebhookOperationStatus
|
||||
Success,
|
||||
CancelledByNotification,
|
||||
NotFound,
|
||||
NoEvents,
|
||||
}
|
||||
|
||||
@@ -20,9 +20,25 @@ public class WebhookService : IWebhookService
|
||||
_eventMessagesFactory = eventMessagesFactory;
|
||||
}
|
||||
|
||||
private WebhookOperationStatus ValidateWebhook(IWebhook webhook)
|
||||
{
|
||||
if (webhook.Events.Length <= 0)
|
||||
{
|
||||
return WebhookOperationStatus.NoEvents;
|
||||
}
|
||||
|
||||
return WebhookOperationStatus.Success;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<Attempt<IWebhook, WebhookOperationStatus>> CreateAsync(IWebhook webhook)
|
||||
{
|
||||
WebhookOperationStatus validationResult = ValidateWebhook(webhook);
|
||||
if (validationResult is not WebhookOperationStatus.Success)
|
||||
{
|
||||
return Attempt.FailWithStatus(validationResult, webhook);
|
||||
}
|
||||
|
||||
using ICoreScope scope = _provider.CreateCoreScope();
|
||||
|
||||
EventMessages eventMessages = _eventMessagesFactory.Get();
|
||||
@@ -45,6 +61,12 @@ public class WebhookService : IWebhookService
|
||||
/// <inheritdoc />
|
||||
public async Task<Attempt<IWebhook, WebhookOperationStatus>> UpdateAsync(IWebhook webhook)
|
||||
{
|
||||
WebhookOperationStatus validationResult = ValidateWebhook(webhook);
|
||||
if (validationResult is not WebhookOperationStatus.Success)
|
||||
{
|
||||
return Attempt.FailWithStatus(validationResult, webhook);
|
||||
}
|
||||
|
||||
using ICoreScope scope = _provider.CreateCoreScope();
|
||||
|
||||
IWebhook? currentWebhook = await _webhookRepository.GetAsync(webhook.Key);
|
||||
|
||||
@@ -269,6 +269,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
|
||||
"imageFileTypes",
|
||||
"loginBackgroundImage",
|
||||
"loginLogoImage",
|
||||
"loginLogoImageAlternative",
|
||||
"canSendRequiredEmail",
|
||||
"usernameIsEmail",
|
||||
"hideBackofficeLogo",
|
||||
@@ -619,6 +620,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers
|
||||
{"allowPasswordReset", _securitySettings.AllowPasswordReset},
|
||||
{"loginBackgroundImage", _contentSettings.LoginBackgroundImage},
|
||||
{"loginLogoImage", _contentSettings.LoginLogoImage },
|
||||
{"loginLogoImageAlternative", _contentSettings.LoginLogoImageAlternative },
|
||||
{"hideBackofficeLogo", _contentSettings.HideBackOfficeLogo },
|
||||
{"disableDeleteWhenReferenced", _contentSettings.DisableDeleteWhenReferenced },
|
||||
{"disableUnpublishWhenReferenced", _contentSettings.DisableUnpublishWhenReferenced },
|
||||
|
||||
@@ -69,6 +69,7 @@ public class EntityController : UmbracoAuthorizedJsonController
|
||||
|
||||
private readonly AppCaches _appCaches;
|
||||
private readonly IDynamicRootService _dynamicRootService;
|
||||
private readonly IVariationContextAccessor _variationContextAccessor;
|
||||
private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor;
|
||||
private readonly IContentService _contentService;
|
||||
private readonly IContentTypeService _contentTypeService;
|
||||
@@ -111,7 +112,8 @@ public class EntityController : UmbracoAuthorizedJsonController
|
||||
IUserService userService,
|
||||
ILocalizationService localizationService,
|
||||
AppCaches appCaches,
|
||||
IDynamicRootService dynamicRootService)
|
||||
IDynamicRootService dynamicRootService,
|
||||
IVariationContextAccessor variationContextAccessor)
|
||||
{
|
||||
_treeService = treeService ?? throw new ArgumentNullException(nameof(treeService));
|
||||
_treeSearcher = treeSearcher ?? throw new ArgumentNullException(nameof(treeSearcher));
|
||||
@@ -139,6 +141,7 @@ public class EntityController : UmbracoAuthorizedJsonController
|
||||
_localizationService = localizationService ?? throw new ArgumentNullException(nameof(localizationService));
|
||||
_appCaches = appCaches ?? throw new ArgumentNullException(nameof(appCaches));
|
||||
_dynamicRootService = dynamicRootService;
|
||||
_variationContextAccessor = variationContextAccessor;
|
||||
}
|
||||
|
||||
[Obsolete("Use non-obsolete ctor. This will be removed in Umbraco 14.")]
|
||||
@@ -183,7 +186,8 @@ public class EntityController : UmbracoAuthorizedJsonController
|
||||
userService,
|
||||
localizationService,
|
||||
appCaches,
|
||||
StaticServiceProvider.Instance.GetRequiredService<IDynamicRootService>())
|
||||
StaticServiceProvider.Instance.GetRequiredService<IDynamicRootService>(),
|
||||
StaticServiceProvider.Instance.GetRequiredService<IVariationContextAccessor>())
|
||||
{
|
||||
|
||||
}
|
||||
@@ -587,6 +591,8 @@ public class EntityController : UmbracoAuthorizedJsonController
|
||||
public DynamicRoot Query { get; set; } = null!;
|
||||
|
||||
public int CurrentId { get; set; }
|
||||
public string? CurrentCulture { get; set; }
|
||||
public string? CurrentSegment { get; set; }
|
||||
|
||||
public int ParentId { get; set; }
|
||||
}
|
||||
@@ -617,6 +623,8 @@ public class EntityController : UmbracoAuthorizedJsonController
|
||||
AnyOfDocTypeKeys = x.AnyOfDocTypeKeys
|
||||
})
|
||||
};
|
||||
|
||||
_variationContextAccessor.VariationContext = new VariationContext(model.CurrentCulture, model.CurrentSegment);
|
||||
var startNodes = (await _dynamicRootService.GetDynamicRootsAsync(startNodeSelector)).ToArray();
|
||||
|
||||
Guid? first = startNodes.Any() ? startNodes.First() : null;
|
||||
|
||||
@@ -102,6 +102,11 @@ public class WebhookController : UmbracoAuthorizedJsonController
|
||||
new("Cancelled by notification", "The operation was cancelled by a notification", NotificationStyle.Error),
|
||||
})),
|
||||
WebhookOperationStatus.NotFound => NotFound("Could not find the webhook"),
|
||||
WebhookOperationStatus.NoEvents => ValidationProblem(new SimpleNotificationModel(new BackOfficeNotification[]
|
||||
{
|
||||
new("No events", "The webhook does not have any events", NotificationStyle.Error),
|
||||
})),
|
||||
_ => StatusCode(StatusCodes.Status500InternalServerError),
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace Umbraco.Cms.Web.BackOffice.Security;
|
||||
/// </summary>
|
||||
public class BackOfficeExternalLoginProviderOptions
|
||||
{
|
||||
private string _buttonStyle = "btn-openid";
|
||||
private string _buttonStyle = string.Empty;
|
||||
|
||||
public BackOfficeExternalLoginProviderOptions(
|
||||
string buttonStyle,
|
||||
@@ -30,8 +30,11 @@ public class BackOfficeExternalLoginProviderOptions
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the icon to use for the login button.
|
||||
/// Gets or sets the style of the login button.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The default look is an outlined button, which has been optimized for the login screen.
|
||||
/// </remarks>
|
||||
[Obsolete("This is no longer used and will be removed in V15. Please set the ButtonLook and ButtonColor properties instead.")]
|
||||
public string ButtonStyle
|
||||
{
|
||||
@@ -71,12 +74,18 @@ public class BackOfficeExternalLoginProviderOptions
|
||||
/// Gets or sets the look to use for the login button.
|
||||
/// See the UUI documentation for more details: https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The default value is <see cref="UuiButtonLook.Outline" />, which has been optimized for the login screen.
|
||||
/// </remarks>
|
||||
public UuiButtonLook ButtonLook { get; set; } = UuiButtonLook.Outline;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the color to use for the login button.
|
||||
/// See the UUI documentation for more details: https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The default value is <see cref="UuiButtonColor.Default" />, which has been optimized for the login screen.
|
||||
/// </remarks>
|
||||
public UuiButtonColor ButtonColor { get; set; } = UuiButtonColor.Default;
|
||||
|
||||
/// <summary>
|
||||
|
||||
8
src/Umbraco.Web.UI.Client/package-lock.json
generated
@@ -39,7 +39,7 @@
|
||||
"ng-file-upload": "12.2.13",
|
||||
"nouislider": "15.7.1",
|
||||
"spectrum-colorpicker2": "2.0.10",
|
||||
"tinymce": "6.7.1",
|
||||
"tinymce": "6.7.3",
|
||||
"typeahead.js": "0.11.1",
|
||||
"underscore": "1.13.6",
|
||||
"wicg-inert": "3.1.2"
|
||||
@@ -16606,9 +16606,9 @@
|
||||
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
|
||||
},
|
||||
"node_modules/tinymce": {
|
||||
"version": "6.7.1",
|
||||
"resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.7.1.tgz",
|
||||
"integrity": "sha512-SIGJgWk2d/X59VbO+i81QfNx2EP1P5t+sza2/1So3OLGtmMBhEJMag7sN/Mo8sq4s0niwb65Z51yLju32jP11g=="
|
||||
"version": "6.7.3",
|
||||
"resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.7.3.tgz",
|
||||
"integrity": "sha512-J7WmYIi/gt1RvZ6Ap2oQiUjzAoiS9pfV+d4GnKuZuPu8agmlAEAInNmMvMjfCNBzHv4JnZXY7qlHUAI0IuYQVA=="
|
||||
},
|
||||
"node_modules/to-absolute-glob": {
|
||||
"version": "2.0.2",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
"ng-file-upload": "12.2.13",
|
||||
"nouislider": "15.7.1",
|
||||
"spectrum-colorpicker2": "2.0.10",
|
||||
"tinymce": "6.7.1",
|
||||
"tinymce": "6.7.3",
|
||||
"typeahead.js": "0.11.1",
|
||||
"underscore": "1.13.6",
|
||||
"wicg-inert": "3.1.2"
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.4 KiB |
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.8.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 468 468" style="enable-background:new 0 0 468 468;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#283A97;}
|
||||
</style>
|
||||
<path class="st0" d="M5.5,233.7C5.7,107.5,108.1,5.3,234.3,5.5s228.4,102.6,228.2,228.8C462.3,360.4,360.1,462.5,234,462.5
|
||||
C107.7,462.4,5.4,360,5.5,233.7L5.5,233.7z M229.4,312c-17.7,0.5-35.4-1.1-52.8-4.8c-12.8-2.6-23.6-11.2-28.9-23.1
|
||||
c-5.2-11.9-7.7-30.3-7.5-55.1c0.1-13,0.9-25.9,2.4-38.8c1.5-12.6,2.9-22.9,4.4-31.1l1.6-8.1c0-0.2,0-0.5,0-0.7
|
||||
c0-2.3-1.6-4.2-3.8-4.6l-29.5-4.6h-0.7c-2.2,0-4,1.5-4.5,3.6c-0.5,1.9-0.8,3.3-1.7,7.8c-1.7,8.7-3.2,17.1-5,29.5
|
||||
c-1.8,13.4-2.9,26.9-3.3,40.4c-0.6,9.4-0.6,18.9,0,28.3c0.7,25,5,45,12.9,59.9s21.2,25.7,40.1,32.3c18.8,6.6,45.1,9.8,78.7,9.6h4.2
|
||||
c33.7,0.1,59.9-3.1,78.7-9.6c18.8-6.6,32.2-17.3,40.1-32.3c7.9-15,12.2-34.9,12.9-59.9c0.6-9.4,0.6-18.9,0-28.3
|
||||
c-0.4-13.5-1.5-27-3.3-40.4c-1.7-12.2-3.3-20.6-5-29.5c-0.9-4.5-1.2-5.9-1.7-7.8c-0.5-2.1-2.3-3.6-4.5-3.6h-0.8l-29.5,4.6
|
||||
c-2.2,0.4-3.9,2.3-3.9,4.6c0,0.2,0,0.5,0,0.7l1.6,8.1c1.5,8.2,3,18.5,4.5,31c1.5,12.9,2.3,25.9,2.4,38.8c0.2,24.8-2.3,43.2-7.6,55.1
|
||||
c-5.2,11.9-15.9,20.5-28.6,23.2c-17.3,3.7-35.1,5.3-52.8,4.8L229.4,312L229.4,312z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.8.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_2_00000127045745957262868980000010863085425149044135_"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 468 468"
|
||||
style="enable-background:new 0 0 468 468;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g id="Layer_1-2">
|
||||
<path class="st0" d="M5.5,233.7C5.7,107.5,108.1,5.3,234.3,5.5s228.3,102.6,228.2,228.8C462.3,360.4,360.1,462.5,234,462.5
|
||||
C107.7,462.4,5.4,360,5.5,233.7L5.5,233.7L5.5,233.7z M229.4,312c-17.7,0.5-35.4-1.1-52.8-4.8c-12.8-2.6-23.6-11.2-28.9-23.1
|
||||
c-5.2-11.9-7.7-30.3-7.5-55.1c0.1-13,0.9-25.9,2.4-38.8c1.5-12.6,2.9-22.9,4.4-31.1l1.6-8.1c0-0.2,0-0.5,0-0.7
|
||||
c0-2.3-1.6-4.2-3.8-4.6l-29.5-4.6h-0.7c-2.2,0-4,1.5-4.5,3.6c-0.5,1.9-0.8,3.3-1.7,7.8c-1.7,8.7-3.2,17.1-5,29.5
|
||||
c-1.8,13.4-2.9,26.9-3.3,40.4c-0.6,9.4-0.6,18.9,0,28.3c0.7,25,5,45,12.9,59.9s21.2,25.7,40.1,32.3c18.8,6.6,45.1,9.8,78.7,9.6h4.2
|
||||
c33.7,0.1,59.9-3.1,78.7-9.6c18.8-6.6,32.1-17.3,40.1-32.3c7.9-15,12.2-34.9,12.9-59.9c0.6-9.4,0.6-18.9,0-28.3
|
||||
c-0.4-13.5-1.5-27-3.3-40.4c-1.7-12.2-3.3-20.6-5-29.5c-0.9-4.5-1.2-5.9-1.7-7.8c-0.5-2.1-2.4-3.6-4.5-3.6h-0.7l-29.5,4.6
|
||||
c-2.2,0.4-3.9,2.3-3.9,4.6c0,0.2,0,0.5,0,0.7l1.6,8.1c1.5,8.2,3,18.5,4.5,31c1.5,12.9,2.3,25.9,2.4,38.8
|
||||
c0.2,24.8-2.3,43.2-7.6,55.1c-5.2,11.9-15.9,20.5-28.6,23.2c-17.3,3.7-35.1,5.3-52.8,4.8H229.4L229.4,312z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.8.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_2_00000159465072208785227250000008040336475015305350_"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1256.6 344.8"
|
||||
style="enable-background:new 0 0 1256.6 344.8;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#283A97;}
|
||||
</style>
|
||||
<g id="Layer_1-2">
|
||||
<g>
|
||||
<path class="st0" d="M5,172.2C5.1,79.7,80.2,4.9,172.6,5s167.3,75.2,167.2,167.6c-0.1,92.4-75,167.2-167.4,167.2
|
||||
C79.9,339.7,5,264.7,5,172.2L5,172.2L5,172.2z M169,229.5c-13,0.4-26-0.8-38.7-3.5c-9.4-1.9-17.3-8.2-21.2-17
|
||||
c-3.8-8.7-5.6-22.2-5.5-40.4c0.1-9.5,0.7-19,1.8-28.4c1.1-9.2,2.2-16.8,3.2-22.8l1.1-5.9c0-0.2,0-0.3,0-0.5c0-1.7-1.2-3.1-2.8-3.4
|
||||
l-21.6-3.4H85c-1.6,0-2.9,1.1-3.3,2.6c-0.4,1.4-0.6,2.4-1.2,5.7c-1.2,6.4-2.4,12.6-3.6,21.6c-1.3,9.8-2.1,19.7-2.4,29.6
|
||||
c-0.5,6.9-0.5,13.8,0,20.7c0.5,18.3,3.7,33,9.4,43.9s15.6,18.8,29.4,23.6c13.8,4.8,33,7.2,57.7,7.1h3.1
|
||||
c24.7,0.1,43.9-2.2,57.7-7.1c13.8-4.8,23.6-12.7,29.4-23.6c5.8-11,8.9-25.6,9.4-43.9c0.5-6.9,0.5-13.8,0-20.7
|
||||
c-0.3-9.9-1.1-19.8-2.4-29.6c-1.3-9-2.4-15.1-3.6-21.6c-0.6-3.3-0.9-4.3-1.2-5.7c-0.4-1.5-1.7-2.6-3.3-2.6h-0.6l-21.6,3.4
|
||||
c-1.6,0.3-2.8,1.7-2.8,3.4c0,0.2,0,0.3,0,0.5l1.2,5.9c1.1,6,2.2,13.6,3.3,22.7c1.1,9.4,1.7,18.9,1.8,28.4
|
||||
c0.2,18.2-1.7,31.6-5.5,40.4c-3.8,8.7-11.6,15-20.9,17c-12.7,2.7-25.7,3.9-38.7,3.5L169,229.5L169,229.5z"/>
|
||||
<g>
|
||||
<path class="st0" d="M1155.2,186.1c0-33.4,9.6-56.9,48.2-56.9s48.2,23.5,48.2,56.9s-9.6,56.9-48.2,56.9
|
||||
S1155.2,219.5,1155.2,186.1z M1227.1,186.1c0-23.2-3-36.5-23.6-36.5s-23.6,13.3-23.6,36.5s3.1,36.5,23.6,36.5
|
||||
S1227.1,209.2,1227.1,186.1z"/>
|
||||
<path class="st0" d="M487.2,238.7c0.6,1,1.6,1.6,2.8,1.6h9c1.8,0,3.2-1.4,3.2-3.2l0,0V135c0-1.8-1.4-3.2-3.2-3.2h-18
|
||||
c-1.8,0-3.2,1.4-3.2,3.2v81c-7.7,4.3-16.4,6.5-25.2,6.3c-11.5,0-17.2-5-17.2-16.1V135c0-1.8-1.4-3.2-3.2-3.2h-17.9
|
||||
c-1.8,0-3.2,1.4-3.2,3.2v73.4c0,20.8,9.8,34.5,37.3,34.5c12.6-0.1,24.9-4.1,35.2-11.3l3.2,7.2L487.2,238.7L487.2,238.7z"/>
|
||||
<path class="st0" d="M689.8,163.7c0-20.6-10.2-34.5-35.9-34.5c-12.4,0-24.5,3.8-34.8,10.7c-4.6-6.7-13.3-10.7-27.8-10.7
|
||||
c-11.8,0.2-23.3,4.2-32.8,11.3l-3.2-7.2l0,0c-0.6-1-1.6-1.7-2.8-1.7h-9c-1.8,0-3.2,1.4-3.2,3.2v102.1c0,1.8,1.4,3.2,3.2,3.2h18
|
||||
c1.8,0,3.2-1.4,3.2-3.2v-80.8c6.9-4.1,14.8-6.3,22.8-6.3c9.8,0,15.4,3.6,15.4,14v73.4c0,1.8,1.4,3.2,3.2,3.2h18
|
||||
c1.8,0,3.2-1.4,3.2-3.2v-81.1c6.8-4.2,14.8-6.4,22.8-6.4c9.6,0,15.4,3.6,15.4,14v73.4c0,1.8,1.4,3.2,3.2,3.2h18
|
||||
c1.8,0,3.2-1.4,3.2-3.2l0,0L689.8,163.7L689.8,163.7z"/>
|
||||
<path class="st0" d="M745.4,231.7c10.2,7.5,22.5,11.5,35.2,11.3c31.7,0,43.4-21.3,43.4-56.9s-11.7-56.9-43.4-56.9
|
||||
c-10.3,0.1-20.4,3-29.1,8.5v-32.8c0-1.8-1.4-3.2-3.2-3.2h-18c-1.8,0-3.2,1.4-3.2,3.2v132.3c0,1.8,1.4,3.2,3.2,3.2h9
|
||||
c1.2,0,2.2-0.6,2.8-1.6l0,0L745.4,231.7L745.4,231.7z M774.9,222.3c-8.2,0-16.3-2.1-23.4-6.3v-59.9c7.1-4.1,15.2-6.3,23.4-6.3
|
||||
c21.3,0,24.5,16.3,24.5,36.2S796.2,222.3,774.9,222.3L774.9,222.3L774.9,222.3z"/>
|
||||
<path class="st0" d="M913.9,150.5c-2.8-0.4-5.6-0.6-8.5-0.5c-9.7-0.4-19.3,1.9-27.8,6.5v80.6c0,1.8-1.4,3.2-3.2,3.2h-18
|
||||
c-1.8,0-3.2-1.4-3.2-3.2V135c0-1.8,1.4-3.2,3.2-3.2h9c1.2,0,2.2,0.6,2.8,1.6l0,0l3.2,7.2c9.9-7.5,22-11.5,34.4-11.3
|
||||
c2.8,0,5.7,0.2,8.5,0.7l0,0c1.7,0,3,2.7,3,4.4v13c0,1.8-1.4,3.2-3.2,3.2h-0.2"/>
|
||||
<path class="st0" d="M976.1,190.2c-10.7,1.3-17.2,5.4-17.2,16.7c0,8.3,3.6,16.1,16.7,16.1c8.3,0.1,16.4-2.4,23.2-7.2v-28.1
|
||||
L976.1,190.2L976.1,190.2z M1004.8,231.7C995.5,239,984,243,972.1,243c-28,0-37.3-17.4-37.3-34.8c0-23.5,15.2-33.4,39.7-35.4
|
||||
l24.4-1.9v-5.4c0-11.1-5.2-15.4-21.3-15.4c-10.1,0-20.1,1.7-29.6,4.9c-0.3,0.1-0.7,0.1-1,0c-1.8,0-3.2-1.4-3.2-3.2v-14.4
|
||||
c0-1.4,0.8-2.6,2.1-3.1l0,0c10.8-3.6,22.1-5.4,33.5-5.4c35.6,0,43.8,15.6,43.8,38.7v69.3c0,1.8-1.4,3.2-3.2,3.2h-9
|
||||
c-1.2,0-2.2-0.6-2.8-1.6l0,0L1004.8,231.7L1004.8,231.7z"/>
|
||||
<path class="st0" d="M1128.6,218c0.3,0,0.7,0,1,0c1.8,0,3.2,1.4,3.2,3.2v14.4c0,1.3-0.8,2.5-2,3l0,0c-8.9,3.2-18.4,4.8-27.9,4.6
|
||||
c-38.5,0-50.3-23-50.3-56.9s11.8-56.9,50.3-56.9c9.4-0.2,18.9,1.2,27.8,4.4l0,0c1.2,0.5,2,1.7,2,3v14.5c0,1.8-1.4,3.2-3.2,3.2
|
||||
c-0.4,0.1-0.7,0.1-1.1,0l0,0c-7.8-2.5-16-3.7-24.2-3.6c-21.1,0-27.2,14.4-27.2,35.4s6.1,35.4,27.2,35.4
|
||||
c8.2,0.1,16.4-1.1,24.2-3.6"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -1,41 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.6.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 530 627.8" style="enable-background:new 0 0 530 627.8;" xml:space="preserve">
|
||||
viewBox="0 0 1025.1 908.1" style="enable-background:new 0 0 1025.1 908.1;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#3544B1;}
|
||||
.st0{fill:#283A97;}
|
||||
</style>
|
||||
<path class="st0" d="M21.2,243.5C21.3,108.8,130.6-0.2,265.3,0S509,109.5,508.8,244.1S399.5,487.6,265,487.6
|
||||
C130.3,487.5,21.1,378.3,21.2,243.5L21.2,243.5z M260,327c-18.9,0.6-37.8-1.1-56.3-5c-13.7-2.8-25.1-12-30.8-24.8
|
||||
c-5.5-12.7-8.2-32.3-8-58.8c0.1-13.8,1-27.7,2.6-41.4c1.6-13.4,3.2-24.4,4.8-33.1l1.7-8.6c0-0.3,0-0.5,0-0.8c0-2.4-1.7-4.5-4.1-4.9
|
||||
l-31.5-4.9h-0.7c-2.3,0-4.3,1.6-4.8,3.8c-0.5,2-0.9,3.5-1.8,8.3c-1.8,9.3-3.5,18.3-5.3,31.5c-1.9,14.3-3.1,28.7-3.5,43.1
|
||||
c-0.7,10.1-0.7,20.1,0,30.2c0.7,26.7,5.3,48,13.7,63.9c8.4,16,22.7,27.4,42.8,34.4c20.1,7,48.1,10.4,84,10.3h4.5
|
||||
c35.9,0.1,63.9-3.3,84-10.3s34.3-18.5,42.8-34.4c8.4-16,13-37.3,13.8-63.9c0.7-10.1,0.7-20.1,0-30.2c-0.4-14.4-1.6-28.8-3.5-43.1
|
||||
c-1.8-13-3.5-22-5.3-31.5c-1-4.8-1.3-6.3-1.8-8.3c-0.5-2.2-2.5-3.8-4.8-3.8h-0.8l-31.5,4.9c-2.4,0.4-4.1,2.5-4.1,4.9
|
||||
c0,0.3,0,0.5,0,0.8l1.7,8.6c1.6,8.7,3.2,19.7,4.8,33.1c1.6,13.8,2.5,27.6,2.6,41.4c0.3,26.5-2.4,46-8,58.8
|
||||
c-5.6,12.7-17,22-30.6,24.8c-18.5,3.9-37.4,5.6-56.3,5.1L260,327z"/>
|
||||
<g>
|
||||
<path class="st0" d="M469.1,591.8c0-21.1,6-35.9,30.4-35.9s30.4,14.8,30.4,35.9s-6,35.9-30.4,35.9S469.1,612.9,469.1,591.8z
|
||||
M514.4,591.8c0-14.7-1.9-23-14.9-23s-14.9,8.4-14.9,23s1.9,23,14.9,23S514.4,606.4,514.4,591.8z"/>
|
||||
<path class="st0" d="M48,625c0.4,0.6,1,1,1.8,1h5.7c1.1,0,2-0.9,2-2v-64.4c0-1.1-0.9-2-2-2H44.1c-1.1,0-2,0.9-2,2v51.1
|
||||
c-4.8,2.7-10.3,4.1-15.9,4c-7.2,0-10.8-3.2-10.8-10.1v-45c0-1.1-0.9-2-2-2H2c-1.1,0-2,0.9-2,2v46.3c0,13.1,6.2,21.8,23.5,21.8
|
||||
c7.9-0.1,15.7-2.6,22.2-7.1l2,4.5L48,625z"/>
|
||||
<path class="st0" d="M175.7,577.7c0-13-6.4-21.8-22.7-21.8c-7.8,0-15.4,2.4-21.9,6.8c-2.9-4.2-8.4-6.8-17.5-6.8
|
||||
c-7.5,0.1-14.7,2.6-20.6,7.1l-2-4.5l0,0c-0.4-0.6-1-1-1.8-1h-5.7c-1.1,0-2,0.9-2,2v64.4c0,1.1,0.9,2,2,2h11.3c1.1,0,2-0.9,2-2v-51
|
||||
c4.3-2.6,9.3-4,14.4-4c6.2,0,9.7,2.3,9.7,8.8V624c0,1.1,0.9,2,2,2h11.3c1.1,0,2-0.9,2-2v-51.1c4.3-2.7,9.3-4.1,14.4-4
|
||||
c6,0,9.7,2.3,9.7,8.8V624c0,1.1,0.9,2,2,2h11.3c1.1,0,2-0.9,2-2L175.7,577.7z"/>
|
||||
<path class="st0" d="M210.7,620.6c6.4,4.8,14.2,7.3,22.2,7.1c20,0,27.4-13.4,27.4-35.9s-7.4-35.9-27.4-35.9
|
||||
c-6.5,0-12.9,1.9-18.4,5.3v-20.7c0-1.1-0.8-2-1.9-2.1c0,0,0,0-0.1,0h-11.4c-1.1,0-2,0.9-2,2V624c0,1.1,0.9,2,2,2h5.7
|
||||
c0.7,0,1.4-0.4,1.8-1l0,0L210.7,620.6z M229.3,614.7c-5.2,0-10.3-1.4-14.8-4v-37.8c4.5-2.6,9.6-4,14.8-4
|
||||
c13.4,0,15.5,10.3,15.5,22.9S242.8,614.7,229.3,614.7L229.3,614.7z"/>
|
||||
<path class="st0" d="M317,569.4c-1.8-0.2-3.5-0.4-5.3-0.3c-6.1-0.3-12.2,1.2-17.5,4.1V624c0,1.1-0.9,2-2,2h-11.3c-1.1,0-2-0.9-2-2
|
||||
v-64.4c0-1.1,0.9-2,2-2h5.7c0.7,0,1.4,0.4,1.8,1l0,0l2,4.5c6.2-4.7,13.8-7.2,21.6-7.1c1.8,0,3.6,0.2,5.4,0.5l0,0
|
||||
c1,0,1.9,1.7,1.9,2.8v8.2c0,1.1-0.9,2-2,2L317,569.4"/>
|
||||
<path class="st0" d="M356.2,594.4c-6.8,0.8-10.8,3.4-10.8,10.5c0,5.2,2.3,10.1,10.5,10.1c5.2,0,10.4-1.5,14.7-4.5v-17.7
|
||||
L356.2,594.4z M374.4,620.6c-5.9,4.6-13.2,7.1-20.7,7.1c-17.7,0-23.5-10.9-23.5-21.9c0-14.8,9.6-21.1,25.1-22.3l15.3-1.2v-3.4
|
||||
c0-7-3.3-9.7-13.4-9.7c-6.4,0-12.7,1.1-18.7,3.1c-0.2,0-0.4,0-0.6,0c-1.1,0-2-0.9-2-2v-9.1c0-0.9,0.5-1.6,1.3-1.9l0,0
|
||||
c6.8-2.3,14-3.4,21.1-3.4c22.5,0,27.6,9.8,27.6,24.4v43.7c0,1.1-0.9,2-2,2h-5.7c-0.7,0-1.4-0.4-1.8-1l0,0L374.4,620.6z"/>
|
||||
<path class="st0" d="M452.4,611.9c0.2,0,0.4,0,0.6,0c1.1,0,2,0.9,2,2v9.1c0,0.8-0.5,1.6-1.2,1.9l0,0c-5.7,2-11.6,3-17.6,2.9
|
||||
c-24.2,0-31.7-14.5-31.7-35.9s7.4-35.9,31.7-35.9c6-0.2,11.9,0.8,17.5,2.8l0,0c0.8,0.3,1.3,1.1,1.3,1.9v9.1c0,1.1-0.9,2-2,2
|
||||
c-0.2,0-0.4,0-0.7,0l0,0c-4.9-1.6-10.1-2.3-15.3-2.2c-13.3,0-17.1,9.1-17.1,22.3s3.8,22.3,17.1,22.3c5.2,0.1,10.3-0.7,15.3-2.3"/>
|
||||
</g>
|
||||
<path class="st0" d="M167.4,354C167.6,163.2,322.5,8.7,513.2,9s345.2,155.1,345,345.9c-0.3,190.6-154.9,345-345.4,345
|
||||
C321.9,699.7,167.3,544.9,167.4,354L167.4,354z M505.8,472.3c-26.8,0.7-53.6-1.7-79.8-7.3c-19.4-3.9-35.6-17-43.7-35
|
||||
c-7.8-18-11.6-45.8-11.3-83.4c0.1-19.6,1.4-39.2,3.7-58.7c2.2-19,4.4-34.6,6.7-46.9l2.4-12.2c0-0.4,0-0.7,0-1.1
|
||||
c0-3.4-2.4-6.3-5.8-6.9l-44.6-6.9h-1c-3.3,0-6.1,2.2-6.8,5.4c-0.8,2.9-1.2,5-2.5,11.8c-2.5,13.1-4.9,25.9-7.5,44.6
|
||||
c-2.8,20.3-4.4,40.7-5,61.1c-1,14.2-1,28.5,0,42.8c1.1,37.8,7.6,68,19.5,90.6s32.1,38.8,60.6,48.8c28.5,9.9,68.1,14.8,119,14.6h6.4
|
||||
c50.9,0.2,90.6-4.6,119-14.6c28.4-9.9,48.6-26.2,60.6-48.8c11.9-22.6,18.4-52.8,19.5-90.6c1-14.2,1-28.5,0-42.8
|
||||
c-0.6-20.4-2.3-40.8-5-61.1c-2.6-18.5-5-31.2-7.5-44.6c-1.3-6.8-1.8-8.9-2.5-11.8c-0.7-3.2-3.6-5.4-6.8-5.4H692l-44.6,6.9
|
||||
c-3.4,0.6-5.9,3.5-5.8,6.9c0,0.4,0,0.7,0,1.1L644,241c2.3,12.4,4.5,28,6.8,46.9c2.3,19.5,3.5,39.1,3.6,58.7
|
||||
c0.4,37.5-3.4,65.3-11.4,83.3c-7.9,18-24,31-43.2,35.1c-26.2,5.6-53,8-79.8,7.2L505.8,472.3z"/>
|
||||
<path class="st0" d="M814,848.2c0-31.1,8.9-53,44.9-53s44.9,21.8,44.9,53s-8.9,53-44.9,53S814,879.3,814,848.2z M880.9,848.2
|
||||
c0-21.7-2.8-34-22-34s-22,12.3-22,34s2.8,34,22,34S880.9,869.8,880.9,848.2z"/>
|
||||
<path class="st0" d="M192,897.2c0.5,0.9,1.5,1.5,2.6,1.5h8.4c1.7,0,3-1.3,3-3l0,0v-95.1c0-1.7-1.3-3-3-3h-16.8c-1.7,0-3,1.3-3,3
|
||||
v75.5c-7.1,4-15.2,6.1-23.4,5.9c-10.7,0-16-4.7-16-15v-66.4c0-1.7-1.3-3-3-3h-16.7c-1.7,0-3,1.3-3,3V869c0,19.4,9.1,32.1,34.8,32.1
|
||||
c11.7-0.1,23.1-3.8,32.8-10.5l3,6.7L192,897.2z"/>
|
||||
<path class="st0" d="M380.6,827.3c0-19.2-9.5-32.2-33.5-32.2c-11.5,0-22.8,3.5-32.4,10c-4.2-6.2-12.4-10-25.9-10
|
||||
c-11,0.2-21.7,3.9-30.5,10.5l-2.9-6.7l0,0c-0.5-0.9-1.5-1.5-2.6-1.5h-8.4c-1.7,0-3,1.3-3,3v95.1c0,1.7,1.3,3,3,3h16.7
|
||||
c1.7,0,3-1.3,3-3v-75.2c6.4-3.9,13.7-5.9,21.2-5.8c9.1,0,14.4,3.3,14.4,13v68.4c0,1.7,1.3,3,3,3h16.7c1.7,0,3-1.3,3-3v-75.5
|
||||
c6.4-4,13.7-6,21.2-5.9c8.9,0,14.4,3.3,14.4,13v68.4c0,1.7,1.3,3,3,3l0,0h16.7c1.7,0,3-1.3,3-3l0,0L380.6,827.3z"/>
|
||||
<path class="st0" d="M432.4,890.7c9.5,7,21,10.7,32.8,10.5c29.5,0,40.4-19.8,40.4-53s-10.9-53-40.4-53c-9.6,0.1-19,2.8-27.1,7.9
|
||||
v-30.6c0-1.7-1.3-3-3-3h-16.7c-1.7,0-3,1.3-3,3v123.2c0,1.7,1.3,3,3,3h8.4c1.1,0,2.1-0.6,2.6-1.5l0,0L432.4,890.7z M459.8,882
|
||||
c-7.7,0-15.2-2-21.8-5.9v-55.8c6.6-3.9,14.2-5.9,21.8-5.8c19.8,0,22.9,15.2,22.9,33.8S479.7,882,459.8,882L459.8,882z"/>
|
||||
<path class="st0" d="M589.3,815.1c-2.6-0.4-5.2-0.5-7.9-0.5c-9-0.4-18,1.7-25.9,6.1v75.1c0,1.7-1.3,3-3,3h-16.7c-1.7,0-3-1.3-3-3
|
||||
v-95.1c0-1.7,1.3-3,3-3h8.4c1.1,0,2.1,0.6,2.6,1.5l0,0l2.9,6.7c9.2-7,20.5-10.7,32-10.5c2.7,0,5.3,0.2,7.9,0.7l0,0
|
||||
c1.5,0,2.8,2.5,2.8,4.1v12.1c0,1.7-1.3,3-3,3h-0.2"/>
|
||||
<path class="st0" d="M647.2,852c-10,1.2-16,5-16,15.6c0,7.7,3.3,15,15.6,15c7.7,0.1,15.3-2.3,21.7-6.7v-26.2L647.2,852z M674,890.7
|
||||
c-8.7,6.8-19.4,10.6-30.5,10.5c-26.1,0-34.8-16.2-34.8-32.4c0-21.8,14.2-31.2,37-33l22.7-1.8v-5c0-10.3-4.8-14.3-19.8-14.3
|
||||
c-9.4,0-18.7,1.5-27.6,4.6c-0.3,0-0.6,0-0.9,0c-1.7,0-3-1.3-3-3v-13.4c0-1.3,0.8-2.4,1.9-2.8l0,0c10.1-3.4,20.6-5.1,31.2-5
|
||||
c33.2,0,40.8,14.6,40.8,36v64.5c0,1.7-1.3,3-3,3l0,0h-8.4c-1.1,0-2.1-0.6-2.6-1.5l0,0L674,890.7z"/>
|
||||
<path class="st0" d="M789.2,877.9c0.3,0,0.6,0,0.9,0c1.7,0,3,1.3,3,3v13.4c0,1.2-0.7,2.3-1.8,2.8l0,0c-8.3,3-17.1,4.4-26,4.2
|
||||
c-35.8,0-46.8-21.5-46.8-53s10.9-53,46.8-53c8.8-0.2,17.6,1.2,25.9,4.1l0,0c1.1,0.5,1.9,1.6,1.9,2.8v13.5c0,1.7-1.3,3-3,3
|
||||
c-0.3,0-0.7,0-1,0l0,0c-7.3-2.3-14.9-3.5-22.5-3.3c-19.6,0-25.3,13.4-25.3,33s5.7,33,25.3,33c7.6,0.1,15.3-1,22.5-3.3"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.8 KiB |
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.6.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1025.1 908.1" style="enable-background:new 0 0 1025.1 908.1;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
</style>
|
||||
<path class="st0" d="M167.4,354C167.6,163.2,322.5,8.7,513.2,9s345.2,155.1,345,345.9c-0.3,190.6-154.9,345-345.4,345
|
||||
C321.9,699.7,167.3,544.9,167.4,354L167.4,354z M505.8,472.3c-26.8,0.7-53.6-1.7-79.8-7.3c-19.4-3.9-35.6-17-43.7-35
|
||||
c-7.8-18-11.6-45.8-11.3-83.4c0.1-19.6,1.4-39.2,3.7-58.7c2.2-19,4.4-34.6,6.7-46.9l2.4-12.2c0-0.4,0-0.7,0-1.1
|
||||
c0-3.4-2.4-6.3-5.8-6.9l-44.6-6.9h-1c-3.3,0-6.1,2.2-6.8,5.4c-0.8,2.9-1.2,5-2.5,11.8c-2.5,13.1-4.9,25.9-7.5,44.6
|
||||
c-2.8,20.3-4.4,40.7-5,61.1c-1,14.2-1,28.5,0,42.8c1.1,37.8,7.6,68,19.5,90.6s32.1,38.8,60.6,48.8c28.5,9.9,68.1,14.8,119,14.6h6.4
|
||||
c50.9,0.2,90.6-4.6,119-14.6c28.4-9.9,48.6-26.2,60.6-48.8c11.9-22.6,18.4-52.8,19.5-90.6c1-14.2,1-28.5,0-42.8
|
||||
c-0.6-20.4-2.3-40.8-5-61.1c-2.6-18.5-5-31.2-7.5-44.6c-1.3-6.8-1.8-8.9-2.5-11.8c-0.7-3.2-3.6-5.4-6.8-5.4H692l-44.6,6.9
|
||||
c-3.4,0.6-5.9,3.5-5.8,6.9c0,0.4,0,0.7,0,1.1L644,241c2.3,12.4,4.5,28,6.8,46.9c2.3,19.5,3.5,39.1,3.6,58.7
|
||||
c0.4,37.5-3.4,65.3-11.4,83.3c-7.9,18-24,31-43.2,35.1c-26.2,5.6-53,8-79.8,7.2L505.8,472.3z"/>
|
||||
<path class="st0" d="M814,848.2c0-31.1,8.9-53,44.9-53s44.9,21.8,44.9,53s-8.9,53-44.9,53S814,879.3,814,848.2z M880.9,848.2
|
||||
c0-21.7-2.8-34-22-34s-22,12.3-22,34s2.8,34,22,34S880.9,869.8,880.9,848.2z"/>
|
||||
<path class="st0" d="M192,897.2c0.5,0.9,1.5,1.5,2.6,1.5h8.4c1.7,0,3-1.3,3-3l0,0v-95.1c0-1.7-1.3-3-3-3h-16.8c-1.7,0-3,1.3-3,3
|
||||
v75.5c-7.1,4-15.2,6.1-23.4,5.9c-10.7,0-16-4.7-16-15v-66.4c0-1.7-1.3-3-3-3h-16.7c-1.7,0-3,1.3-3,3V869c0,19.4,9.1,32.1,34.8,32.1
|
||||
c11.7-0.1,23.1-3.8,32.8-10.5l3,6.7L192,897.2z"/>
|
||||
<path class="st0" d="M380.6,827.3c0-19.2-9.5-32.2-33.5-32.2c-11.5,0-22.8,3.5-32.4,10c-4.2-6.2-12.4-10-25.9-10
|
||||
c-11,0.2-21.7,3.9-30.5,10.5l-2.9-6.7l0,0c-0.5-0.9-1.5-1.5-2.6-1.5h-8.4c-1.7,0-3,1.3-3,3v95.1c0,1.7,1.3,3,3,3h16.7
|
||||
c1.7,0,3-1.3,3-3v-75.2c6.4-3.9,13.7-5.9,21.2-5.8c9.1,0,14.4,3.3,14.4,13v68.4c0,1.7,1.3,3,3,3h16.7c1.7,0,3-1.3,3-3v-75.5
|
||||
c6.4-4,13.7-6,21.2-5.9c8.9,0,14.4,3.3,14.4,13v68.4c0,1.7,1.3,3,3,3l0,0h16.7c1.7,0,3-1.3,3-3l0,0L380.6,827.3z"/>
|
||||
<path class="st0" d="M432.4,890.7c9.5,7,21,10.7,32.8,10.5c29.5,0,40.4-19.8,40.4-53s-10.9-53-40.4-53c-9.6,0.1-19,2.8-27.1,7.9
|
||||
v-30.6c0-1.7-1.3-3-3-3h-16.7c-1.7,0-3,1.3-3,3v123.2c0,1.7,1.3,3,3,3h8.4c1.1,0,2.1-0.6,2.6-1.5l0,0L432.4,890.7z M459.8,882
|
||||
c-7.7,0-15.2-2-21.8-5.9v-55.8c6.6-3.9,14.2-5.9,21.8-5.8c19.8,0,22.9,15.2,22.9,33.8S479.7,882,459.8,882L459.8,882z"/>
|
||||
<path class="st0" d="M589.3,815.1c-2.6-0.4-5.2-0.5-7.9-0.5c-9-0.4-18,1.7-25.9,6.1v75.1c0,1.7-1.3,3-3,3h-16.7c-1.7,0-3-1.3-3-3
|
||||
v-95.1c0-1.7,1.3-3,3-3h8.4c1.1,0,2.1,0.6,2.6,1.5l0,0l2.9,6.7c9.2-7,20.5-10.7,32-10.5c2.7,0,5.3,0.2,7.9,0.7l0,0
|
||||
c1.5,0,2.8,2.5,2.8,4.1v12.1c0,1.7-1.3,3-3,3h-0.2"/>
|
||||
<path class="st0" d="M647.2,852c-10,1.2-16,5-16,15.6c0,7.7,3.3,15,15.6,15c7.7,0.1,15.3-2.3,21.7-6.7v-26.2L647.2,852z M674,890.7
|
||||
c-8.7,6.8-19.4,10.6-30.5,10.5c-26.1,0-34.8-16.2-34.8-32.4c0-21.8,14.2-31.2,37-33l22.7-1.8v-5c0-10.3-4.8-14.3-19.8-14.3
|
||||
c-9.4,0-18.7,1.5-27.6,4.6c-0.3,0-0.6,0-0.9,0c-1.7,0-3-1.3-3-3v-13.4c0-1.3,0.8-2.4,1.9-2.8l0,0c10.1-3.4,20.6-5.1,31.2-5
|
||||
c33.2,0,40.8,14.6,40.8,36v64.5c0,1.7-1.3,3-3,3l0,0h-8.4c-1.1,0-2.1-0.6-2.6-1.5l0,0L674,890.7z"/>
|
||||
<path class="st0" d="M789.2,877.9c0.3,0,0.6,0,0.9,0c1.7,0,3,1.3,3,3v13.4c0,1.2-0.7,2.3-1.8,2.8l0,0c-8.3,3-17.1,4.4-26,4.2
|
||||
c-35.8,0-46.8-21.5-46.8-53s10.9-53,46.8-53c8.8-0.2,17.6,1.2,25.9,4.1l0,0c1.1,0.5,1.9,1.6,1.9,2.8v13.5c0,1.7-1.3,3-3,3
|
||||
c-0.3,0-0.7,0-1,0l0,0c-7.3-2.3-14.9-3.5-22.5-3.3c-19.6,0-25.3,13.4-25.3,33s5.7,33,25.3,33c7.6,0.1,15.3-1,22.5-3.3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
@@ -1,41 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1180 316" style="enable-background:new 0 0 1180 316;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
</style>
|
||||
<path class="st0" d="M0.2,157.8C0.3,70.6,71.1-0.1,158.3,0.1S316.2,71,316.1,158.2s-70.8,157.7-157.9,157.7
|
||||
C70.8,315.9,0.1,245.1,0.2,157.8L0.2,157.8z M154.9,211.9c-12.3,0.4-24.5-0.7-36.5-3.3c-8.8-1.8-16.3-7.8-19.9-16
|
||||
c-3.6-8.2-5.3-20.9-5.2-38.1c0.1-9,0.6-17.9,1.7-26.8c1-8.7,2.1-15.8,3.1-21.5l1.1-5.6c0-0.2,0-0.3,0-0.5c0-1.6-1.1-2.9-2.6-3.2
|
||||
l-20.4-3.2h-0.4c-1.5,0-2.8,1-3.1,2.5c-0.3,1.3-0.6,2.3-1.2,5.4c-1.2,6-2.2,11.8-3.4,20.4c-1.3,9.3-2,18.6-2.3,27.9
|
||||
c-0.4,6.5-0.4,13,0,19.6c0.5,17.3,3.4,31.1,8.9,41.4c5.5,10.3,14.7,17.8,27.7,22.3c13,4.5,31.2,6.8,54.4,6.7h2.9
|
||||
c23.3,0.1,41.4-2.1,54.4-6.7c13-4.5,22.2-12,27.7-22.3c5.5-10.3,8.4-24.1,8.9-41.4c0.4-6.5,0.4-13,0-19.6
|
||||
c-0.3-9.3-1-18.7-2.3-27.9c-1.2-8.4-2.3-14.3-3.4-20.4c-0.6-3.1-0.8-4.1-1.2-5.4c-0.3-1.4-1.6-2.5-3.1-2.5h-0.5l-20.4,3.2
|
||||
c-1.6,0.3-2.7,1.6-2.7,3.2c0,0.2,0,0.3,0,0.5l1.1,5.6c1,5.6,2.1,12.8,3.1,21.5c1,8.9,1.6,17.9,1.7,26.8
|
||||
c0.2,17.1-1.6,29.8-5.2,38.1c-3.6,8.2-11,14.2-19.8,16.1c-12,2.5-24.2,3.6-36.5,3.3L154.9,211.9z"/>
|
||||
<path class="st0" d="M1087.2,168c0-30.4,8.6-51.7,43.8-51.7s43.8,21.3,43.8,51.7s-8.6,51.7-43.8,51.7S1087.2,198.4,1087.2,168
|
||||
L1087.2,168z M1152.5,168c0-21.1-2.7-33.1-21.5-33.1s-21.5,12-21.5,33.1s2.8,33.1,21.5,33.1C1149.8,201.1,1152.5,189.1,1152.5,168
|
||||
z"/>
|
||||
<path class="st0" d="M480.4,215.8c0.5,0.9,1.5,1.5,2.5,1.4h8.2c1.6,0,2.9-1.3,2.9-2.9v-92.7c0-1.6-1.3-2.9-2.9-2.9h-16.3
|
||||
c-1.6,0-2.9,1.3-2.9,2.9v73.6c-7,3.9-14.9,5.9-22.8,5.8c-10.4,0-15.6-4.5-15.6-14.6v-64.8c0-1.6-1.3-2.9-2.9-2.9h-16.4
|
||||
c-1.6,0-2.9,1.3-2.9,2.9v66.7c0,18.9,8.9,31.3,33.9,31.3c11.4-0.1,22.6-3.7,32-10.2l2.9,6.5L480.4,215.8z"/>
|
||||
<path class="st0" d="M664.5,147.7c0-18.7-9.3-31.4-32.6-31.4c-11.3,0-22.3,3.4-31.6,9.8c-4.1-6.1-12-9.8-25.3-9.8
|
||||
c-10.7,0.2-21.1,3.8-29.7,10.2l-2.9-6.5c-0.5-0.9-1.5-1.5-2.5-1.4h-8.3c-1.6,0-2.9,1.3-2.9,2.9v92.8c0,1.6,1.3,2.9,2.9,2.9h16.3
|
||||
c1.6,0,2.9-1.3,2.9-2.9v-73.5c6.2-3.8,13.4-5.8,20.7-5.8c8.9,0,14,3.3,14,12.6v66.7c0,1.6,1.3,2.9,2.9,2.9h16.3
|
||||
c1.6,0,2.9-1.3,2.9-2.9v-73.6c6.2-3.9,13.4-5.9,20.7-5.8c8.6,0,14,3.3,14,12.6v66.7c0,1.6,1.3,2.9,2.9,2.9h16.3
|
||||
c1.6,0,2.9-1.3,2.9-2.9L664.5,147.7z"/>
|
||||
<path class="st0" d="M714.9,209.4c9.3,6.9,20.5,10.5,32,10.2c28.8,0,39.4-19.3,39.4-51.7s-10.7-51.7-39.4-51.7
|
||||
c-9.4,0-18.5,2.7-26.4,7.7V94.2c0-1.6-1.2-2.9-2.8-3c0,0-0.1,0-0.1,0h-16.5c-1.6,0-2.9,1.3-2.9,2.9v120.3c0,1.6,1.3,2.9,2.9,2.9
|
||||
h8.2c1,0,2-0.5,2.5-1.4L714.9,209.4z M741.7,200.9c-7.5,0-14.8-2-21.3-5.8v-54.4c6.5-3.8,13.8-5.8,21.3-5.8
|
||||
c19.3,0,22.3,14.8,22.3,32.9S761.2,200.9,741.7,200.9L741.7,200.9z"/>
|
||||
<path class="st0" d="M868,135.7c-2.5-0.3-5.1-0.5-7.7-0.5c-8.8-0.4-17.5,1.7-25.3,5.9v73.2c0,1.6-1.3,2.9-2.9,2.9h-16.3
|
||||
c-1.6,0-2.9-1.3-2.9-2.9v-92.7c0-1.6,1.3-2.9,2.9-2.9h8.2c1,0,2,0.5,2.5,1.4l2.9,6.5c8.9-6.8,19.9-10.4,31.2-10.2
|
||||
c2.6,0,5.2,0.2,7.7,0.6c1.4,0,2.7,2.4,2.7,4v11.8c0,1.6-1.3,2.9-2.9,2.9h-0.2"/>
|
||||
<path class="st0" d="M924.6,171.8c-9.8,1.2-15.6,4.9-15.6,15.2c0,7.5,3.3,14.6,15.2,14.6c7.5,0.1,14.9-2.2,21.1-6.5v-25.5
|
||||
L924.6,171.8z M950.7,209.4c-8.5,6.7-19,10.3-29.8,10.2c-25.5,0-33.9-15.8-33.9-31.6c0-21.3,13.8-30.4,36.1-32.1l22.1-1.8v-4.9
|
||||
c0-10.1-4.7-14-19.3-14c-9.2,0-18.3,1.5-26.9,4.5c-0.3,0-0.6,0-0.9,0c-1.6,0-2.9-1.3-2.9-2.9v-13.1c0-1.2,0.7-2.4,1.9-2.8
|
||||
c9.8-3.3,20.1-5,30.5-4.9c32.3,0,39.8,14.2,39.8,35.1v62.9c0,1.6-1.3,2.9-2.9,2.9h-8.2c-1,0-2-0.5-2.5-1.4L950.7,209.4z"/>
|
||||
<path class="st0" d="M1063,197c0.3,0,0.6,0,0.9,0c1.6,0,2.9,1.3,2.9,2.9v13.1c0,1.2-0.7,2.3-1.8,2.7c-8.1,2.9-16.7,4.3-25.4,4.1
|
||||
c-34.9,0-45.7-20.9-45.7-51.7s10.7-51.7,45.7-51.7c8.6-0.2,17.1,1.1,25.2,4c1.1,0.4,1.9,1.5,1.8,2.7v13.1c0,1.6-1.3,2.9-2.9,2.9
|
||||
c-0.3,0-0.6,0-0.9,0c-7.1-2.2-14.6-3.3-22-3.1c-19.1,0-24.7,13.1-24.7,32.2s5.5,32.1,24.7,32.1c7.5,0.1,14.9-1,22-3.3"/>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.8.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_2_00000109717856507224707600000004572449649498936508_"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1256.6 344.8"
|
||||
style="enable-background:new 0 0 1256.6 344.8;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g id="Layer_1-2">
|
||||
<g>
|
||||
<path class="st0" d="M5,172.2C5.1,79.7,80.2,4.9,172.6,5s167.3,75.2,167.2,167.6c-0.1,92.4-75,167.2-167.4,167.2
|
||||
C79.9,339.7,4.9,264.7,5,172.2L5,172.2L5,172.2z M169,229.5c-13,0.4-26-0.8-38.7-3.5c-9.4-1.9-17.3-8.2-21.2-17
|
||||
c-3.8-8.7-5.6-22.2-5.5-40.4c0.1-9.5,0.7-19,1.8-28.4c1.1-9.2,2.2-16.8,3.2-22.8l1.1-5.9c0-0.2,0-0.3,0-0.5c0-1.7-1.2-3.1-2.8-3.4
|
||||
l-21.6-3.4H85c-1.6,0-2.9,1.1-3.3,2.6c-0.4,1.4-0.6,2.4-1.2,5.7c-1.2,6.4-2.4,12.6-3.6,21.6c-1.3,9.8-2.1,19.7-2.4,29.6
|
||||
c-0.5,6.9-0.5,13.8,0,20.7c0.5,18.3,3.7,33,9.4,43.9s15.6,18.8,29.4,23.6c13.8,4.8,33,7.2,57.7,7.1h3.1
|
||||
c24.7,0.1,43.9-2.2,57.7-7.1c13.8-4.8,23.6-12.7,29.4-23.6c5.8-11,8.9-25.6,9.4-43.9c0.5-6.9,0.5-13.8,0-20.7
|
||||
c-0.3-9.9-1.1-19.8-2.4-29.6c-1.3-8.9-2.4-15.1-3.6-21.6c-0.6-3.3-0.9-4.3-1.2-5.7c-0.4-1.5-1.7-2.6-3.3-2.6h-0.6l-21.6,3.4
|
||||
c-1.6,0.3-2.8,1.7-2.8,3.4c0,0.2,0,0.3,0,0.5l1.2,5.9c1.1,6,2.2,13.6,3.3,22.7c1.1,9.4,1.7,18.9,1.8,28.4
|
||||
c0.2,18.2-1.7,31.6-5.5,40.4c-3.8,8.7-11.6,15-20.9,17c-12.7,2.7-25.7,3.9-38.7,3.5L169,229.5L169,229.5z"/>
|
||||
<g>
|
||||
<path class="st0" d="M1155.2,186.1c0-33.4,9.6-56.9,48.2-56.9s48.2,23.5,48.2,56.9s-9.6,56.9-48.2,56.9
|
||||
S1155.2,219.5,1155.2,186.1z M1227.1,186.1c0-23.2-3-36.5-23.6-36.5s-23.6,13.3-23.6,36.5s3.1,36.5,23.6,36.5
|
||||
S1227.1,209.2,1227.1,186.1z"/>
|
||||
<path class="st0" d="M487.2,238.7c0.6,1,1.6,1.6,2.8,1.6h9c1.8,0,3.2-1.4,3.2-3.2l0,0V135c0-1.8-1.4-3.2-3.2-3.2h-18
|
||||
c-1.8,0-3.2,1.4-3.2,3.2v81c-7.7,4.3-16.4,6.5-25.2,6.3c-11.5,0-17.2-5-17.2-16.1V135c0-1.8-1.4-3.2-3.2-3.2h-17.9
|
||||
c-1.8,0-3.2,1.4-3.2,3.2v73.4c0,20.8,9.8,34.5,37.3,34.5c12.6-0.1,24.9-4.1,35.2-11.3l3.2,7.2L487.2,238.7L487.2,238.7z"/>
|
||||
<path class="st0" d="M689.8,163.7c0-20.6-10.2-34.5-35.9-34.5c-12.4,0-24.5,3.8-34.8,10.7c-4.6-6.7-13.3-10.7-27.8-10.7
|
||||
c-11.8,0.2-23.3,4.2-32.8,11.3l-3.2-7.2l0,0c-0.6-1-1.6-1.7-2.8-1.7h-9c-1.8,0-3.2,1.4-3.2,3.2v102.1c0,1.8,1.4,3.2,3.2,3.2h18
|
||||
c1.8,0,3.2-1.4,3.2-3.2v-80.8c6.9-4.1,14.8-6.3,22.8-6.3c9.8,0,15.4,3.6,15.4,14v73.4c0,1.8,1.4,3.2,3.2,3.2h18
|
||||
c1.8,0,3.2-1.4,3.2-3.2v-81.1c6.8-4.2,14.8-6.4,22.8-6.4c9.6,0,15.4,3.6,15.4,14v73.4c0,1.8,1.4,3.2,3.2,3.2h18
|
||||
c1.8,0,3.2-1.4,3.2-3.2l0,0L689.8,163.7L689.8,163.7z"/>
|
||||
<path class="st0" d="M745.4,231.7c10.2,7.5,22.5,11.5,35.2,11.3c31.7,0,43.4-21.3,43.4-56.9s-11.7-56.9-43.4-56.9
|
||||
c-10.3,0.1-20.4,3-29.1,8.5v-32.9c0-1.8-1.4-3.2-3.2-3.2h-18c-1.8,0-3.2,1.4-3.2,3.2v132.3c0,1.8,1.4,3.2,3.2,3.2h9
|
||||
c1.2,0,2.2-0.6,2.8-1.6l0,0L745.4,231.7L745.4,231.7z M774.9,222.3c-8.2,0-16.3-2.1-23.4-6.3v-59.9c7.1-4.1,15.2-6.3,23.4-6.3
|
||||
c21.3,0,24.5,16.3,24.5,36.2S796.2,222.3,774.9,222.3L774.9,222.3L774.9,222.3z"/>
|
||||
<path class="st0" d="M913.9,150.5c-2.8-0.4-5.6-0.6-8.5-0.5c-9.7-0.4-19.3,1.9-27.8,6.5v80.6c0,1.8-1.4,3.2-3.2,3.2h-18
|
||||
c-1.8,0-3.2-1.4-3.2-3.2V135c0-1.8,1.4-3.2,3.2-3.2h9c1.2,0,2.2,0.6,2.8,1.6l0,0l3.2,7.2c9.9-7.5,22-11.5,34.4-11.3
|
||||
c2.8,0,5.7,0.2,8.5,0.7l0,0c1.7,0,3,2.7,3,4.4v13c0,1.8-1.4,3.2-3.2,3.2L913.9,150.5"/>
|
||||
<path class="st0" d="M976.1,190.2c-10.7,1.3-17.2,5.4-17.2,16.7c0,8.3,3.6,16.1,16.7,16.1c8.3,0.1,16.4-2.4,23.2-7.2v-28.1
|
||||
L976.1,190.2L976.1,190.2z M1004.8,231.7C995.5,239,984,243,972.1,243c-28,0-37.3-17.4-37.3-34.8c0-23.5,15.2-33.4,39.7-35.4
|
||||
l24.4-1.9v-5.4c0-11.1-5.2-15.4-21.3-15.4c-10.1,0-20.1,1.7-29.6,4.9c-0.3,0.1-0.7,0.1-1,0c-1.8,0-3.2-1.4-3.2-3.2v-14.4
|
||||
c0-1.4,0.8-2.6,2.1-3.1l0,0c10.8-3.6,22.1-5.4,33.5-5.4c35.6,0,43.8,15.6,43.8,38.7v69.3c0,1.8-1.4,3.2-3.2,3.2h-9
|
||||
c-1.2,0-2.2-0.6-2.8-1.6l0,0L1004.8,231.7L1004.8,231.7z"/>
|
||||
<path class="st0" d="M1128.6,218c0.3,0,0.7,0,1,0c1.8,0,3.2,1.4,3.2,3.2v14.4c0,1.3-0.8,2.5-2,3l0,0c-8.9,3.2-18.4,4.8-27.9,4.6
|
||||
c-38.5,0-50.3-23-50.3-56.9s11.8-56.9,50.3-56.9c9.4-0.2,18.9,1.2,27.8,4.4l0,0c1.2,0.5,2,1.7,2,3v14.5c0,1.8-1.4,3.2-3.2,3.2
|
||||
c-0.4,0.1-0.7,0.1-1.1,0l0,0c-7.8-2.5-16-3.7-24.2-3.6c-21.1,0-27.2,14.4-27.2,35.4s6.1,35.4,27.2,35.4
|
||||
c8.2,0.1,16.4-1.1,24.2-3.6"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.3 KiB |
@@ -1,3 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 315.89 315.89">
|
||||
<path fill="#ffffff" d="M0,157.74A157.95,157.95,0,1,1,158,315.89,157.95,157.95,0,0,1,0,157.74Zm154.74,54.09a155.41,155.41,0,0,1-36.5-3.29,27.92,27.92,0,0,1-19.94-16q-5.35-12.34-5.21-38.1a243,243,0,0,1,1.69-26.84q1.55-13,3.09-21.46l1.07-5.59a2,2,0,0,0,0-.49,3.2,3.2,0,0,0-2.65-3.17L75.92,93.67h-.44a3.19,3.19,0,0,0-3.11,2.48c-.35,1.31-.56,2.27-1.17,5.38-1.16,6-2.24,11.85-3.43,20.38a264.17,264.17,0,0,0-2.3,27.94,145.24,145.24,0,0,0,0,19.57q.72,25.94,8.9,41.42t27.72,22.3q19.53,6.81,54.43,6.66h2.91q34.94.15,54.41-6.66t27.71-22.3q8.17-15.53,8.91-41.42a145.24,145.24,0,0,0,0-19.57,266.84,266.84,0,0,0-2.3-27.94c-1.2-8.44-2.27-14.26-3.44-20.38-.61-3.11-.81-4.07-1.16-5.38a3.21,3.21,0,0,0-3.12-2.48h-.52l-20.38,3.18a3.2,3.2,0,0,0-2.68,3.17,4,4,0,0,0,0,.49l1.08,5.59q1.55,8.48,3.12,21.46a245.68,245.68,0,0,1,1.65,26.84q.27,25.69-5.21,38.07a27.9,27.9,0,0,1-19.76,16.07,155.19,155.19,0,0,1-36.48,3.29Z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 979 B |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 803 KiB |
@@ -1,996 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1920 1164" style="enable-background:new 0 0 1920 1164;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#162335;}
|
||||
.st1{opacity:0.15;clip-path:url(#SVGID_00000090293870806755067250000000317586838450182291_);}
|
||||
.st2{fill:#F3EAE4;}
|
||||
.st3{clip-path:url(#SVGID_00000070113695316645383610000001712759489273656489_);fill:#FFBDB9;}
|
||||
.st4{clip-path:url(#SVGID_00000075843369450780882590000018304811172571820694_);fill:#A27F50;}
|
||||
.st5{clip-path:url(#SVGID_00000114034649374907102010000012501853726559711373_);fill:#3145B7;}
|
||||
.st6{clip-path:url(#SVGID_00000127037541451816541270000016371668593058341040_);fill:#FFD300;}
|
||||
.st7{clip-path:url(#SVGID_00000091008438605608225920000000315481828206359465_);fill:#FF9600;}
|
||||
.st8{clip-path:url(#SVGID_00000042721456288192175210000017252967253312151945_);fill:#F3EAE4;}
|
||||
.st9{clip-path:url(#SVGID_00000174559905860832418740000005930937852351674762_);fill:#FF9600;}
|
||||
.st10{clip-path:url(#SVGID_00000065791090563711400540000010729552114256640928_);fill:#FFD300;}
|
||||
.st11{clip-path:url(#SVGID_00000062180740900565005160000014289549524927882152_);fill:#3145B7;}
|
||||
.st12{clip-path:url(#SVGID_00000021833513224660800930000015167875017063112895_);fill:#3145B7;}
|
||||
.st13{clip-path:url(#SVGID_00000163752188322379460200000014798754354093305274_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st14{clip-path:url(#SVGID_00000028317097161535322600000003200059692132963474_);fill:#A27F50;}
|
||||
.st15{clip-path:url(#SVGID_00000039108951912012441520000017084405196299693957_);fill:#F3EAE4;}
|
||||
.st16{clip-path:url(#SVGID_00000157987525770752761490000013542556672184759980_);}
|
||||
.st17{fill:#FFFFFF;}
|
||||
.st18{fill:#3544B1;}
|
||||
.st19{clip-path:url(#SVGID_00000091703280769569818000000010335507978643512228_);fill:#F3EAE4;}
|
||||
.st20{clip-path:url(#SVGID_00000060030161443498345100000005552921972525717690_);fill:#F3EAE4;}
|
||||
.st21{clip-path:url(#SVGID_00000110457175270969588530000008326702304618511236_);fill:#F3EAE4;}
|
||||
.st22{clip-path:url(#SVGID_00000029739674117829278330000003779816123607768967_);fill:#F3EAE4;}
|
||||
.st23{clip-path:url(#SVGID_00000026849832425217534260000004636316856488745875_);fill:#F3EAE4;}
|
||||
.st24{clip-path:url(#SVGID_00000116917663594767186610000001578964402888997311_);fill:#F3EAE4;}
|
||||
.st25{clip-path:url(#SVGID_00000020390687939977957210000017888699008171536567_);fill:#F3EAE4;}
|
||||
.st26{clip-path:url(#SVGID_00000003808154914975360100000016909747310715974570_);fill:#F3EAE4;}
|
||||
.st27{clip-path:url(#SVGID_00000062169895112765073370000013538511770730444717_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st28{clip-path:url(#SVGID_00000039843819757838035890000014952353533090789539_);fill:#3145B7;}
|
||||
.st29{clip-path:url(#SVGID_00000099622440703124522590000002015578837295386764_);fill:#3145B7;}
|
||||
.st30{clip-path:url(#SVGID_00000031920499672808860590000017610435297387704966_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st31{clip-path:url(#SVGID_00000005952946952662073040000017888004863064174225_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st32{clip-path:url(#SVGID_00000082336303615642129200000004303792997334875807_);fill:#3145B7;}
|
||||
.st33{clip-path:url(#SVGID_00000158022921070923414790000013365080768646084024_);fill:#FFBDB9;}
|
||||
.st34{clip-path:url(#SVGID_00000055686146885346621100000000179325491043175610_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st35{clip-path:url(#SVGID_00000052813346379009156530000004922920765573750151_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st36{clip-path:url(#SVGID_00000129905332388902522290000014385566074184355517_);fill:#FF9600;}
|
||||
.st37{display:none;}
|
||||
.st38{display:inline;}
|
||||
.st39{clip-path:url(#SVGID_00000158022330813853105950000007657820932599079582_);fill:#3145B7;}
|
||||
.st40{clip-path:url(#SVGID_00000094607308816606182360000008687096036294449024_);fill:#F3EAE4;}
|
||||
.st41{clip-path:url(#SVGID_00000056395133295577587630000008837991618149312901_);fill:#FFD300;}
|
||||
.st42{clip-path:url(#SVGID_00000019661639217342865990000009233089476329617806_);fill:#F3EAE4;}
|
||||
.st43{clip-path:url(#SVGID_00000059299243084970535850000002182865148877870469_);fill:#FF9600;}
|
||||
.st44{clip-path:url(#SVGID_00000011752712870160810620000005187202262485773729_);fill:#FFBDB9;}
|
||||
.st45{clip-path:url(#SVGID_00000090979366369002677930000010283540804097392550_);fill:#FFD300;}
|
||||
.st46{clip-path:url(#SVGID_00000027575873363329459850000006702558975383226800_);fill:#FFBDB9;}
|
||||
.st47{clip-path:url(#SVGID_00000121265087618356283780000004575120213201557950_);fill:#A27F50;}
|
||||
.st48{clip-path:url(#SVGID_00000151513739239955657730000007881363040184376739_);fill:#F3EAE4;}
|
||||
.st49{clip-path:url(#SVGID_00000158011583716730457190000007434161654466355337_);}
|
||||
.st50{clip-path:url(#SVGID_00000173121351737293248970000007382609512645786008_);fill:#F3EAE4;}
|
||||
.st51{clip-path:url(#SVGID_00000053543486661402211190000009049354371535394229_);fill:#F3EAE4;}
|
||||
.st52{clip-path:url(#SVGID_00000114045990286884446730000016411874908029891747_);fill:#F3EAE4;}
|
||||
.st53{clip-path:url(#SVGID_00000061432217720344096580000001086655428742766721_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st54{clip-path:url(#SVGID_00000029022101935107221860000007900443689338981505_);fill:#3145B7;}
|
||||
.st55{clip-path:url(#SVGID_00000158749784546363628160000007132654974501017781_);fill:#3145B7;}
|
||||
.st56{clip-path:url(#SVGID_00000047771193418432778300000007364612500109819065_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st57{clip-path:url(#SVGID_00000027598422104023127670000017536641365182917778_);fill:#F3EAE4;}
|
||||
.st58{clip-path:url(#SVGID_00000145057228657985445070000009833495665326229676_);fill:#3145B7;}
|
||||
.st59{clip-path:url(#SVGID_00000164510783797795358920000001297447488505271169_);fill:#FFBDB9;}
|
||||
.st60{clip-path:url(#SVGID_00000183210534738960289470000012549520974992092605_);fill:#FF9600;}
|
||||
.st61{clip-path:url(#SVGID_00000145033303631728425180000018242923401148984729_);fill:#FF9600;}
|
||||
.st62{clip-path:url(#SVGID_00000181058607705335751820000017109601273387990711_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st63{clip-path:url(#SVGID_00000003803945813288096500000013297607200281059724_);fill:#FFFFFF;}
|
||||
.st64{clip-path:url(#SVGID_00000066490804380119822450000000238697413927315847_);}
|
||||
.st65{enable-background:new ;}
|
||||
.st66{clip-path:url(#SVGID_00000026850991908260154970000002729197413015215752_);}
|
||||
.st67{fill:#3544AF;}
|
||||
.st68{clip-path:url(#SVGID_00000106119462739386678340000000075329083703506623_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st69{clip-path:url(#SVGID_00000148620075436344653540000000060441797712170932_);fill:#FF9600;}
|
||||
.st70{clip-path:url(#SVGID_00000172421713886179014920000013417145008224878489_);fill:#F3EAE4;}
|
||||
</style>
|
||||
<g id="BG">
|
||||
<g>
|
||||
<rect class="st0" width="1920" height="1164"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Grid">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000066508109028710391750000002760786598431068833_">
|
||||
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<g id="XMLID_00000169553296605018520650000009583362662613329074_" style="opacity:0.15;clip-path:url(#SVGID_00000066508109028710391750000002760786598431068833_);">
|
||||
<g id="XMLID_00000089533767977427416860000002856307549709686712_">
|
||||
<polygon id="XMLID_00000020386790585824403190000017984947571202498464_" class="st2" points="1046.2,-602 -149.3,88.2
|
||||
-150.5,87.5 1044.9,-602.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000079485464328753927070000017344551978158930853_">
|
||||
<g id="XMLID_00000105396543925583186770000010007617077871067064_">
|
||||
<polygon id="XMLID_00000030447176062218687610000011280814739186361244_" class="st2" points="3084.1,574.6 1888.6,1264.8
|
||||
1887.3,1264 3082.8,573.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000074430583175465043050000014465236438230282924_">
|
||||
<g id="XMLID_00000088130056824636874240000002464213041115755943_">
|
||||
<polygon id="XMLID_00000062175903925239596000000008041680726996673446_" class="st2" points="869.7,676.4 -325.7,1366.6
|
||||
-327,1365.9 868.5,675.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000083069549404367248860000007217742145287901589_">
|
||||
<polygon id="XMLID_00000008139291666922122570000012102126541959940769_" class="st2" points="1039.6,774.5 -155.9,1464.7
|
||||
-157.2,1463.9 1038.3,773.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000021797759130191935540000017706669620804642213_">
|
||||
<polygon id="XMLID_00000021085076175625815590000012977775825311568830_" class="st2" points="1209.4,872.5 13.9,1562.7
|
||||
12.6,1562 1208.1,871.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000011029401244887712300000004018912544120840094_">
|
||||
<polygon id="XMLID_00000060711519009022682130000005888609043029195941_" class="st2" points="1379.2,970.6 183.7,1660.8
|
||||
182.5,1660 1377.9,969.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000008845042768853454300000006107721104721923984_">
|
||||
<polygon id="XMLID_00000159448461406785226410000011154189825773772424_" class="st2" points="1549,1068.6 353.6,1758.8
|
||||
352.3,1758.1 1547.7,1067.9 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000183938260474069450590000005733445126966918040_">
|
||||
<polygon id="XMLID_00000109027559143075142070000003275257065592299692_" class="st2" points="1205.2,1658.6 1203.9,1659.3
|
||||
185,1071 186.3,1070.3 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000181785703601070526200000018271999443858828458_">
|
||||
<polygon id="XMLID_00000176730513543404402920000005219528788391774140_" class="st2" points="1375.9,1560 1374.6,1560.8
|
||||
355.7,972.5 357,971.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000098900167758876521400000007256897303825822899_">
|
||||
<polygon id="XMLID_00000123414029494862687430000011295825590158006663_" class="st2" points="1546.6,1461.5 1545.3,1462.2
|
||||
526.4,873.9 527.7,873.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000120541844177750148960000015765172927395996335_">
|
||||
<polygon id="XMLID_00000091009740777232208480000004997513642232138126_" class="st2" points="1717.3,1362.9 1716,1363.7
|
||||
697,775.4 698.3,774.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000118355078533686810820000003100777614129437325_">
|
||||
<polygon id="XMLID_00000166672215177793308500000005674963425617888901_" class="st2" points="1887.9,1264.4 1886.6,1265.2
|
||||
867.7,676.9 869,676.1 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000039132575836957327170000013353388136977081229_">
|
||||
<polygon id="XMLID_00000040548753926414093050000009132634391083360444_" class="st2" points="1888.6,1264 1887.3,1264.8
|
||||
868.4,676.5 869.7,675.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000170252114345429024420000005520947815301686151_">
|
||||
<polygon id="XMLID_00000169523348876260283860000016897506182633037736_" class="st2" points="2065.1,-13.7 869.7,676.5
|
||||
868.4,675.7 2063.9,-14.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000043422792016811913920000002463899567321544088_">
|
||||
<polygon id="XMLID_00000035503190491679368530000006108738000028088226_" class="st2" points="2235,84.3 1039.5,774.5
|
||||
1038.2,773.8 2233.7,83.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000156583662898040535930000009947452185944681871_">
|
||||
<polygon id="XMLID_00000173849494843523431030000012378568542357647267_" class="st2" points="2404.8,182.4 1209.3,872.6
|
||||
1208,871.8 2403.5,181.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000145765834912961207760000006429975694617969327_">
|
||||
<polygon id="XMLID_00000034058892427085389630000011940217923393613186_" class="st2" points="2574.6,280.4 1379.1,970.6
|
||||
1377.9,969.9 2573.3,279.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000136404070384164422290000016741913111589034157_">
|
||||
<polygon id="XMLID_00000118384633024219384660000005186074227492587917_" class="st2" points="2744.4,378.5 1549,1068.7
|
||||
1547.7,1067.9 2743.1,377.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000005247398313954491530000015532925810583642251_">
|
||||
<polygon id="XMLID_00000091001475206582501090000008487252876912167816_" class="st2" points="2914.2,476.5 1718.8,1166.7
|
||||
1717.5,1166 2913,475.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000137123563281348051350000016734458728433029760_">
|
||||
<polygon id="XMLID_00000168833887534346560560000010059870189874967738_" class="st2" points="2059.3,1165.5 2058,1166.2
|
||||
1039.1,577.9 1040.3,577.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000168095860651493586530000017646707311662482853_">
|
||||
<polygon id="XMLID_00000065760007464936870980000017678622537967898044_" class="st2" points="2230,1066.9 2228.7,1067.7
|
||||
1209.7,479.4 1211,478.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000157292286247854109570000001441054465897594779_">
|
||||
<polygon id="XMLID_00000160171263507890820760000005497286094216786572_" class="st2" points="2400.6,968.4 2399.3,969.1
|
||||
1380.4,380.9 1381.7,380.1 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000085209890575466928280000010377678481953940648_">
|
||||
<polygon id="XMLID_00000044173582130028286200000001537620779878779817_" class="st2" points="2571.3,869.9 2570,870.6
|
||||
1551.1,282.3 1552.4,281.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000136369159460067149300000011868857726015315881_">
|
||||
<polygon id="XMLID_00000047760733375327048070000017762681438431221901_" class="st2" points="2742,771.3 2740.7,772.1
|
||||
1721.7,183.8 1723,183 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000041974696609876830600000005670271776326177195_">
|
||||
<polygon id="XMLID_00000129189358748097425900000016230039239487626931_" class="st2" points="2912.6,672.8 2911.4,673.5
|
||||
1892.4,85.3 1893.7,84.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000041293895709094064820000009783370564313938334_">
|
||||
<polygon id="XMLID_00000015352334506883659860000008662127655563954606_" class="st2" points="20.6,186.2 -1174.8,876.4
|
||||
-1176.1,875.7 19.4,185.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000007390172772709378140000014137098145099763097_">
|
||||
<polygon id="XMLID_00000101103173169684591870000013226181548395502493_" class="st2" points="190.5,284.3 -1005,974.5
|
||||
-1006.3,973.7 189.2,283.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000000186738115847274800000004595450111546749358_">
|
||||
<polygon id="XMLID_00000014634371684113466930000014673643692297164446_" class="st2" points="360.3,382.3 -835.2,1072.5
|
||||
-836.5,1071.8 359,381.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000008830344121994999530000016753635616681531532_">
|
||||
<polygon id="XMLID_00000016767079653101325290000014185810922251035036_" class="st2" points="530.1,480.3 -665.4,1170.5
|
||||
-666.6,1169.8 528.8,479.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000102520461909151795810000015434115650182429095_">
|
||||
<polygon id="XMLID_00000021801600352416943000000015896325962502917295_" class="st2" points="699.9,578.4 -495.5,1268.6
|
||||
-496.8,1267.8 698.6,577.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000067200152001110196230000003606268878771070371_">
|
||||
<polygon id="XMLID_00000080912121959675076060000010999721409079993764_" class="st2" points="15.6,1168.8 14.3,1169.6
|
||||
-1004.6,581.3 -1003.3,580.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000041982285474608565810000004559185799639543716_">
|
||||
<polygon id="XMLID_00000047752160458784607960000018420580237055922821_" class="st2" points="186.3,1070.3 185,1071
|
||||
-833.9,482.7 -832.6,482 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000021092668367371603480000014302288429492100003_">
|
||||
<polygon id="XMLID_00000133522729132041306360000016426437187584250778_" class="st2" points="357,971.7 355.7,972.5
|
||||
-663.2,384.2 -662,383.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000043440687175549670490000000185411293111546267_">
|
||||
<polygon id="XMLID_00000054247774033148285290000002248920634348494738_" class="st2" points="527.7,873.2 526.4,873.9
|
||||
-492.6,285.7 -491.3,284.9 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000034077211944538950860000015606712309263985808_">
|
||||
<polygon id="XMLID_00000063617114352312488480000016033742238509047936_" class="st2" points="698.3,774.7 697,775.4
|
||||
-321.9,187.1 -320.6,186.4 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000139287038625357713070000000661456859636452481_">
|
||||
<polygon id="XMLID_00000177465485952367752830000000433349159663821728_" class="st2" points="869,676.1 867.7,676.9
|
||||
-151.2,88.6 -149.9,87.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000152983286059050966320000016367525973260780725_">
|
||||
<polygon id="XMLID_00000160186459663839767080000012127778829681724802_" class="st2" points="869.7,675.7 868.4,676.5
|
||||
-150.5,88.2 -149.3,87.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000021803673430177058290000009300669789135999394_">
|
||||
<polygon id="XMLID_00000166674682338414516090000002023737629610576294_" class="st2" points="1216,-504 20.6,186.2
|
||||
19.3,185.5 1214.7,-504.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000027584758907444302940000000439449324323913647_">
|
||||
<polygon id="XMLID_00000106848951270708658320000000374409828880877758_" class="st2" points="1385.8,-405.9 190.4,284.3
|
||||
189.1,283.6 1384.6,-406.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000129894934288089775370000001306545012910883507_">
|
||||
<polygon id="XMLID_00000059303132923395936600000017724211843501679495_" class="st2" points="1555.7,-307.9 360.2,382.3
|
||||
358.9,381.6 1554.4,-308.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000176725769730970743970000018414718406782887342_">
|
||||
<polygon id="XMLID_00000014628985006399707260000015468628637635334034_" class="st2" points="1725.5,-209.8 530,480.4
|
||||
528.7,479.6 1724.2,-210.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000151510541662397458580000007655244852968895647_">
|
||||
<polygon id="XMLID_00000007394365587086662230000008461292989746959762_" class="st2" points="1895.3,-111.8 699.9,578.4
|
||||
698.6,577.7 1894,-112.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000062194518888472429840000017147849831603331256_">
|
||||
<polygon id="XMLID_00000106859706457774314660000013220619198826666636_" class="st2" points="2065.1,-13.7 869.7,676.5
|
||||
868.4,675.7 2063.9,-14.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000007429036987148007550000010681519545412170402_">
|
||||
<polygon id="XMLID_00000046306630197373423780000015115640819116702855_" class="st2" points="1040.3,577.2 1039.1,577.9
|
||||
20.1,-10.3 21.4,-11.1 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000022538457593175977690000008424135092628186022_">
|
||||
<polygon id="XMLID_00000028321459259680269050000015502024227616169118_" class="st2" points="1211,478.7 1209.7,479.4
|
||||
190.8,-108.9 192.1,-109.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000098918655834541259140000001408141438622944175_">
|
||||
<polygon id="XMLID_00000114045012543386457050000008016354056212450701_" class="st2" points="1381.7,380.1 1380.4,380.9
|
||||
361.5,-207.4 362.8,-208.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000136405441145348369250000017012471294048381098_">
|
||||
<polygon id="XMLID_00000123438865971816913180000006211344053696890762_" class="st2" points="1552.4,281.6 1551.1,282.3
|
||||
532.1,-305.9 533.4,-306.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000036930566646481894160000008330066632914404759_">
|
||||
<polygon id="XMLID_00000011740484236623867440000009554288470579594940_" class="st2" points="1723,183 1721.7,183.8
|
||||
702.8,-404.5 704.1,-405.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000098184613231558345480000013477082369138778284_">
|
||||
<polygon id="XMLID_00000031925202698778351660000001429369697827315606_" class="st2" points="1893.7,84.5 1892.4,85.3
|
||||
873.5,-503 874.8,-503.8 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="V1">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000127736852682445842370000002348014254331820450_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000054984103335254951850000000913394718092417707_">
|
||||
<use xlink:href="#SVGID_00000127736852682445842370000002348014254331820450_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000054984103335254951850000000913394718092417707_);fill:#FFBDB9;" points="0,513.6
|
||||
-79.8,561.2 0,610 79.9,561.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000026148469511049754200000009968401991571475348_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000079475587327847231050000002911551116668149183_">
|
||||
<use xlink:href="#SVGID_00000026148469511049754200000009968401991571475348_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000079475587327847231050000002911551116668149183_);fill:#A27F50;" points="1716,146
|
||||
1657.2,181.1 1716,217 1774.9,181.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000145753635600874933320000004897962307761384079_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000129904978439157718520000005299637536228623266_">
|
||||
<use xlink:href="#SVGID_00000145753635600874933320000004897962307761384079_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000129904978439157718520000005299637536228623266_);fill:#3145B7;" points="0,1069.6
|
||||
-132.8,1148.8 0,1230 133,1149.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000165931441860217597670000008050027574356636296_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000137835636617730584380000003367441586327331492_">
|
||||
<use xlink:href="#SVGID_00000165931441860217597670000008050027574356636296_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000137835636617730584380000003367441586327331492_);fill:#FFD300;" points="0,1025.3
|
||||
-132.8,1104.5 0,1185.7 133,1105.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000034065140043565596850000017478044862292536739_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000177450352250662692710000006424829503085921197_">
|
||||
<use xlink:href="#SVGID_00000034065140043565596850000017478044862292536739_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000177450352250662692710000006424829503085921197_);fill:#FF9600;" points="756,-23.4
|
||||
676.2,24.2 756,73 835.9,24.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000155147677355237900320000012556576578435659186_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000072279143137885720190000016131542453732360618_">
|
||||
<use xlink:href="#SVGID_00000155147677355237900320000012556576578435659186_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000072279143137885720190000016131542453732360618_);fill:#F3EAE4;" points="756,-50
|
||||
676.2,-2.4 756,46.4 835.9,-1.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000101082060867471068270000014364909690227397045_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000127738072831676665790000004087370255366363297_">
|
||||
<use xlink:href="#SVGID_00000101082060867471068270000014364909690227397045_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000127738072831676665790000004087370255366363297_);fill:#FF9600;" points="361,916.6
|
||||
275.1,967.9 361,1020.4 447,968.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000119107677403441221450000008812412828791479228_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000044145067228804199670000005771684367502909608_">
|
||||
<use xlink:href="#SVGID_00000119107677403441221450000008812412828791479228_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000044145067228804199670000005771684367502909608_);fill:#FFD300;" points="1045,146
|
||||
982.9,183 1045,221 1107.2,183.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000154422838857326783960000014893307211605333395_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000069362693926221279310000008339412765463041459_">
|
||||
<use xlink:href="#SVGID_00000154422838857326783960000014893307211605333395_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000069362693926221279310000008339412765463041459_);fill:#3145B7;" points="249,24
|
||||
186.9,61 249,99 311.2,61.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000082333957203797916110000018260977802411740587_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000093869962036583297480000005863197771722376098_">
|
||||
<use xlink:href="#SVGID_00000082333957203797916110000018260977802411740587_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000093869962036583297480000005863197771722376098_);fill:#3145B7;" points="700.4,513.2
|
||||
599.9,573.1 700.4,634.6 801,573.9 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000045619507921140421650000003729377017819897514_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000039826899951146924250000000289990911954531738_">
|
||||
<use xlink:href="#SVGID_00000045619507921140421650000003729377017819897514_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000039826899951146924250000000289990911954531738_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
402,407 528.8,479.6 358.5,578.5 528.5,676.5 186.5,874.1 311.4,946.2 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000000194086928070729720000000519840430203006593_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000168805357699523429570000007485248425140512397_">
|
||||
<use xlink:href="#SVGID_00000000194086928070729720000000519840430203006593_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000168805357699523429570000007485248425140512397_);fill:#A27F50;" points="351,316
|
||||
249.1,376.7 351,439 453,377.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000165943850828845075270000016825892426304043950_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000052812963253688462610000015184149813544607365_">
|
||||
<use xlink:href="#SVGID_00000165943850828845075270000016825892426304043950_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000052812963253688462610000015184149813544607365_);fill:#F3EAE4;" points="351,282
|
||||
249.1,342.7 351,405 453,343.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000048473689437072489640000006590337839646135194_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000051362265157955842450000015189917957128887190_">
|
||||
<use xlink:href="#SVGID_00000048473689437072489640000006590337839646135194_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000051362265157955842450000015189917957128887190_);">
|
||||
<polygon class="st17" points="1727.1,823.9 1156.2,1154 1549,1394 2120.3,1061 "/>
|
||||
<polygon class="st18" points="1664.6,787 1093.7,1117.1 1150.9,1151.6 1722.2,818.6 "/>
|
||||
<ellipse class="st17" cx="1143.4" cy="1121.1" rx="10.6" ry="6.9"/>
|
||||
<ellipse class="st17" cx="1166.5" cy="1108.8" rx="10.6" ry="6.9"/>
|
||||
<ellipse class="st17" cx="1191.7" cy="1097.5" rx="10.6" ry="6.9"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000118393621064128169980000017729977469728550811_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000013872575964963308350000007609819028209525673_">
|
||||
<use xlink:href="#SVGID_00000118393621064128169980000017729977469728550811_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000013872575964963308350000007609819028209525673_);fill:#F3EAE4;" cx="402.5" cy="406.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000124852063949419209040000015054686950021975466_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000137116810284659946330000010248236107917044124_">
|
||||
<use xlink:href="#SVGID_00000124852063949419209040000015054686950021975466_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000137116810284659946330000010248236107917044124_);fill:#F3EAE4;" cx="1690.5" cy="199.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000152259323569216362720000002840477086840399515_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000011721577418556256600000009798367043526060219_">
|
||||
<use xlink:href="#SVGID_00000152259323569216362720000002840477086840399515_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000011721577418556256600000009798367043526060219_);fill:#F3EAE4;" cx="1191.7" cy="1061.4" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000022562585366509584930000010091813104120547246_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000094616677291308378500000011001471672871354765_">
|
||||
<use xlink:href="#SVGID_00000022562585366509584930000010091813104120547246_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000094616677291308378500000011001471672871354765_);fill:#F3EAE4;" cx="1534.5" cy="863.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000096758967414071434260000006111871748037986962_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000028307089590291275020000001830403630949639861_">
|
||||
<use xlink:href="#SVGID_00000096758967414071434260000006111871748037986962_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000028307089590291275020000001830403630949639861_);fill:#F3EAE4;" cx="1362.5" cy="961.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000072961285232518210380000018244758777564582070_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000120532252740828006120000005421162930229796535_">
|
||||
<use xlink:href="#SVGID_00000072961285232518210380000018244758777564582070_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000120532252740828006120000005421162930229796535_);fill:#F3EAE4;" cx="748.5" cy="605.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000125574736855597190500000012683660085374787771_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000011718705093108660700000014716482287151188114_">
|
||||
<use xlink:href="#SVGID_00000125574736855597190500000012683660085374787771_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000011718705093108660700000014716482287151188114_);fill:#F3EAE4;" cx="1680.5" cy="795.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000053507786266854058100000003229449386748352189_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000002380940919774352270000006597272452379592887_">
|
||||
<use xlink:href="#SVGID_00000053507786266854058100000003229449386748352189_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000002380940919774352270000006597272452379592887_);fill:#F3EAE4;" cx="1076.5" cy="203.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000005243615577130758860000006088090072822634398_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000165219407360349789220000016135559495675424177_">
|
||||
<use xlink:href="#SVGID_00000005243615577130758860000006088090072822634398_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000165219407360349789220000016135559495675424177_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1076.2,203.4 1211.2,282.5 1041.5,380.5 1380.5,578.5 1210.5,676.5 1534.6,863.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000093900036644532195270000008885511590077827492_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000158712862332577233010000013536020692585303724_">
|
||||
<use xlink:href="#SVGID_00000093900036644532195270000008885511590077827492_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000158712862332577233010000013536020692585303724_);fill:#3145B7;" points="1315,1096
|
||||
1210.1,1154.7 1553,1355 1655,1293.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000143605751713329844920000013822395586009177769_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000042704168709325867040000004356789687594446978_">
|
||||
<use xlink:href="#SVGID_00000143605751713329844920000013822395586009177769_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000042704168709325867040000004356789687594446978_);fill:#3145B7;" points="1725,862
|
||||
1334.1,1083.7 1672,1281 2063,1058.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000150077470909687320590000000401425548870225310_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000092445074584587390290000004397237593822884993_">
|
||||
<use xlink:href="#SVGID_00000150077470909687320590000000401425548870225310_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000092445074584587390290000004397237593822884993_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
400.6,996.5 526.2,1070.1 867.3,872.9 1200,1065.6 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000183218555234574158940000014155854597877894822_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000045581142689473481140000001453531232810003623_">
|
||||
<use xlink:href="#SVGID_00000183218555234574158940000014155854597877894822_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000045581142689473481140000001453531232810003623_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1690.8,201.6 1380.1,380.3 1467,429 1846.8,649.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000142176680661118001700000000056292506240106629_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000020363588066720560260000006246216324370381193_">
|
||||
<use xlink:href="#SVGID_00000142176680661118001700000000056292506240106629_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000020363588066720560260000006246216324370381193_);fill:#3145B7;" points="1546,415
|
||||
1444.1,475.7 1546,538 1648,476.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000168810118848037961950000012505611063114676155_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000049210143493618968680000002229873306805486506_">
|
||||
<use xlink:href="#SVGID_00000168810118848037961950000012505611063114676155_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000049210143493618968680000002229873306805486506_);fill:#FFBDB9;" points="1546,381
|
||||
1444.1,441.7 1546,504 1648,442.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000165922301747348760930000012983865177890492308_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000004524134036829400490000014328108213026689722_">
|
||||
<use xlink:href="#SVGID_00000165922301747348760930000012983865177890492308_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<line style="clip-path:url(#SVGID_00000004524134036829400490000014328108213026689722_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" x1="1851.8" y1="697" x2="1680.7" y2="795.8"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000125563833770909976000000003279072340221467035_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000062161585541973031370000002108836801420466072_">
|
||||
<use xlink:href="#SVGID_00000125563833770909976000000003279072340221467035_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<line style="clip-path:url(#SVGID_00000062161585541973031370000002108836801420466072_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" x1="748.6" y1="605.5" x2="1362.7" y2="961.5"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000059286052358303095300000000391935342780460702_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000127045372486389353300000004096268284369660033_">
|
||||
<use xlink:href="#SVGID_00000059286052358303095300000000391935342780460702_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000127045372486389353300000004096268284369660033_);fill:#FF9600;" points="1877,628
|
||||
1797.2,675.6 1877,724.4 1956.9,676.2 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="V2" class="st37">
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000143614369986136362270000007560653516744853689_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000133499380238303515840000005905569892772177586_">
|
||||
<use xlink:href="#SVGID_00000143614369986136362270000007560653516744853689_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000133499380238303515840000005905569892772177586_);fill:#3145B7;" points="0,513.6
|
||||
-79.8,561.2 0,610 79.9,561.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000121255238383532626980000007297960717014315679_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000156583132613635255580000001608079459649643911_">
|
||||
<use xlink:href="#SVGID_00000121255238383532626980000007297960717014315679_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000156583132613635255580000001608079459649643911_);fill:#F3EAE4;" points="0,1069.6
|
||||
-132.8,1148.8 0,1230 133,1149.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000060023958902487786010000001645203670006047367_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000093870412984825956080000001082601028832750770_">
|
||||
<use xlink:href="#SVGID_00000060023958902487786010000001645203670006047367_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000093870412984825956080000001082601028832750770_);fill:#FFD300;" points="0,1025.3
|
||||
-132.8,1104.5 0,1185.7 133,1105.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000090255600037663639700000010647737479641217948_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000127736745835869221250000016463224839949700768_">
|
||||
<use xlink:href="#SVGID_00000090255600037663639700000010647737479641217948_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000127736745835869221250000016463224839949700768_);fill:#F3EAE4;" points="756,-23.4
|
||||
676.2,24.2 756,73 835.9,24.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000039127304168117280280000012078189384173010850_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000041988513719087917250000004691727834069373077_">
|
||||
<use xlink:href="#SVGID_00000039127304168117280280000012078189384173010850_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000041988513719087917250000004691727834069373077_);fill:#FF9600;" points="756,-50
|
||||
676.2,-2.4 756,46.4 835.9,-1.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000023995343828850366440000016916099664025849239_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000082348548081903710580000000021353711819211697_">
|
||||
<use xlink:href="#SVGID_00000023995343828850366440000016916099664025849239_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000082348548081903710580000000021353711819211697_);fill:#FFBDB9;" points="697,551.8
|
||||
650.1,579.8 697,608.5 744,580.2 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000115478454368905652440000012939993213725062806_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000141424335908505696050000017955398454523774649_">
|
||||
<use xlink:href="#SVGID_00000115478454368905652440000012939993213725062806_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000141424335908505696050000017955398454523774649_);fill:#FFD300;" points="1213,47
|
||||
1150.9,84 1213,122 1275.2,84.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000055668343319898750820000001804962040182697604_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000126283024313299661180000002830917718937153673_">
|
||||
<use xlink:href="#SVGID_00000055668343319898750820000001804962040182697604_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000126283024313299661180000002830917718937153673_);fill:#FFBDB9;" points="249,24
|
||||
186.9,61 249,99 311.2,61.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000014630341636951485590000005905790639244285594_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000077305139023293154890000015804768298382291086_">
|
||||
<use xlink:href="#SVGID_00000014630341636951485590000005905790639244285594_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000077305139023293154890000015804768298382291086_);fill:#A27F50;" points="351,316
|
||||
249.1,376.7 351,439 453,377.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000097459112887082222460000004635324953426236859_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000099630129309124272560000005424888522754882189_">
|
||||
<use xlink:href="#SVGID_00000097459112887082222460000004635324953426236859_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000099630129309124272560000005424888522754882189_);fill:#F3EAE4;" points="351,282
|
||||
249.1,342.7 351,405 453,343.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000009592065457736750930000002568202835339755965_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000074420048083180720850000005660015341651636618_">
|
||||
<use xlink:href="#SVGID_00000009592065457736750930000002568202835339755965_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000074420048083180720850000005660015341651636618_);">
|
||||
<polygon class="st17" points="1776.8,806 1119.4,1186.1 1571.7,1462.5 2229.6,1079.1 "/>
|
||||
<polygon class="st18" points="1704.8,763.5 1047.4,1143.6 1113.3,1183.3 1771.2,799.9 "/>
|
||||
<ellipse class="st17" cx="1104.6" cy="1148.3" rx="12.3" ry="7.9"/>
|
||||
<ellipse class="st17" cx="1131.3" cy="1134.1" rx="12.3" ry="7.9"/>
|
||||
<ellipse class="st17" cx="1160.2" cy="1121" rx="12.3" ry="7.9"/>
|
||||
</g>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000065782803800424876200000005747599800107267464_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000011747768830144233880000006562306095018839473_">
|
||||
<use xlink:href="#SVGID_00000065782803800424876200000005747599800107267464_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000011747768830144233880000006562306095018839473_);fill:#F3EAE4;" cx="402.5" cy="406.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000169552306152978148960000000544137394431524748_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000013157062394338683150000013515564009310648999_">
|
||||
<use xlink:href="#SVGID_00000169552306152978148960000000544137394431524748_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000013157062394338683150000013515564009310648999_);fill:#F3EAE4;" cx="1362.5" cy="961.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000169550641910798302390000018079750890223912613_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000013883916898646908530000013926501663757172128_">
|
||||
<use xlink:href="#SVGID_00000169550641910798302390000018079750890223912613_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000013883916898646908530000013926501663757172128_);fill:#F3EAE4;" cx="1247.5" cy="104.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000129176931204107253050000015002324711644247170_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000029008757185472032850000013986890390064364204_">
|
||||
<use xlink:href="#SVGID_00000129176931204107253050000015002324711644247170_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000029008757185472032850000013986890390064364204_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1248.5,105.5 1382.5,183.5 1552.5,85.5 1721.5,183.5 1381.5,380.5 1549.5,477.5 1721.5,576.5 1301.5,818.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000154398845280440012690000012695258342323463351_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000160163617090155004710000001635626138734186666_">
|
||||
<use xlink:href="#SVGID_00000154398845280440012690000012695258342323463351_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000160163617090155004710000001635626138734186666_);fill:#3145B7;" points="
|
||||
1302.2,1119.3 1181.4,1187 1576.3,1417.6 1693.7,1346.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000088097803390984933370000010578364190482803123_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000109738877249508613360000015102492162918906520_">
|
||||
<use xlink:href="#SVGID_00000088097803390984933370000010578364190482803123_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000109738877249508613360000015102492162918906520_);fill:#3145B7;" points="1774.4,849.9
|
||||
1324.2,1105.2 1713.3,1332.4 2163.6,1076.1 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000016066467601354244220000002018156486310614195_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000150798237870894630030000002779999083364707242_">
|
||||
<use xlink:href="#SVGID_00000016066467601354244220000002018156486310614195_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000150798237870894630030000002779999083364707242_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1112.5,927.5 865.5,1069.5 356.9,773.5 187.5,677.5 358.5,578.5 529.5,479.5 402,407 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000082330699241480134340000004261941559118969516_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000152258910213155202580000000896616385851496102_">
|
||||
<use xlink:href="#SVGID_00000082330699241480134340000004261941559118969516_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000152258910213155202580000000896616385851496102_);fill:#F3EAE4;" points="1546,415
|
||||
1444.1,475.7 1546,538 1648,476.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000017502376985705843720000016794955214344614288_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000014593979418167035950000016708929353612887732_">
|
||||
<use xlink:href="#SVGID_00000017502376985705843720000016794955214344614288_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000014593979418167035950000016708929353612887732_);fill:#3145B7;" points="1049,328
|
||||
947.1,388.7 1049,451 1151,389.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000161618323926346785290000009029845740765637550_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000101088622576841138830000008061094839055885965_">
|
||||
<use xlink:href="#SVGID_00000161618323926346785290000009029845740765637550_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000101088622576841138830000008061094839055885965_);fill:#FFBDB9;" points="1546,381
|
||||
1444.1,441.7 1546,504 1648,442.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000093861940671694908680000016382552859857510793_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000137094997539696298690000006818698997336822665_">
|
||||
<use xlink:href="#SVGID_00000093861940671694908680000016382552859857510793_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000137094997539696298690000006818698997336822665_);fill:#FF9600;" points="1877,628
|
||||
1797.2,675.6 1877,724.4 1956.9,676.2 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000004504296126374307120000008264859571140435641_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000183249326757029932450000006511838227619820166_">
|
||||
<use xlink:href="#SVGID_00000004504296126374307120000008264859571140435641_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000183249326757029932450000006511838227619820166_);fill:#FF9600;" points="1716,146
|
||||
1657.2,181.1 1716,217 1774.9,181.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000160900346452575354020000007118520698774230666_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000101809427109148069640000003478486000252273540_">
|
||||
<use xlink:href="#SVGID_00000160900346452575354020000007118520698774230666_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<line style="clip-path:url(#SVGID_00000101809427109148069640000003478486000252273540_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" x1="1233.5" y1="886.5" x2="1362.5" y2="961.6"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000062184612866266282820000012222770164839208331_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000176006039373874794540000003432218681784018326_">
|
||||
<use xlink:href="#SVGID_00000062184612866266282820000012222770164839208331_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000176006039373874794540000003432218681784018326_);fill:#FFFFFF;" points="1273.6,803.3
|
||||
1083.7,912.4 1140.9,946.9 1331,835 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000111904075869562228390000000029301977090326158_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000051354684401989131050000010437733296546684332_">
|
||||
<use xlink:href="#SVGID_00000111904075869562228390000000029301977090326158_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000051354684401989131050000010437733296546684332_);">
|
||||
<g>
|
||||
<g class="st65">
|
||||
<g>
|
||||
<g>
|
||||
<defs>
|
||||
<polygon id="SVGID_00000095325708202275608810000001183464575504323259_" points="1136.6,923.1 1115.4,911.9 1281.2,823.7
|
||||
1302.4,834.9 "/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000063595377401201767860000011444569133170569648_">
|
||||
<use xlink:href="#SVGID_00000095325708202275608810000001183464575504323259_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000063595377401201767860000011444569133170569648_);">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st67" d="M1250.4,858c-3,1.6-5.4,0.8-8.8-0.9c-3.4-1.8-5-3-1.9-4.7h0.1c3-1.6,5.4-0.8,8.8,0.9
|
||||
S1253.5,856.3,1250.4,858C1250.5,857.9,1250.5,857.9,1250.4,858 M1236.9,850.7c-0.1,0-0.1,0.1-0.2,0.1
|
||||
c-5.7,3.1-3.6,5.7,1.3,8.2s9.7,3.6,15.3,0.6c0.1,0,0.1-0.1,0.2-0.1c5.7-3.1,3.6-5.7-1.3-8.2
|
||||
C1247.3,848.7,1242.5,847.7,1236.9,850.7"/>
|
||||
<path class="st67" d="M1133.3,907.5l-2.6,1.4c-0.3,0.1-0.3,0.4,0,0.5l12,6.2c-0.5,0.9-1.4,1.8-2.7,2.5c0,0,0,0-0.1,0
|
||||
h-0.1c-1.7,0.9-3.2,0.9-4.8,0.1l-10.5-5.5c-0.3-0.1-0.7-0.1-1,0l-2.6,1.4c-0.3,0.1-0.3,0.4,0,0.5l10.9,5.6
|
||||
c3,1.6,6.5,1.8,10.5-0.3c0.1,0,0.1-0.1,0.2-0.1c1.8-1,3.1-2.3,3.5-3.7l1.5,0.3l0,0c0.2,0,0.5,0,0.7-0.1l1.3-0.7
|
||||
c0.3-0.1,0.3-0.4,0-0.5l-15.1-7.8C1134,907.3,1133.6,907.3,1133.3,907.5"/>
|
||||
<path class="st67" d="M1155.9,894.8C1155.9,894.8,1155.8,894.8,1155.9,894.8c-1.9,1.1-3.2,2.4-3.6,3.7
|
||||
c-1.6-0.1-3.5,0.2-5.5,1.3c0,0-0.1,0-0.1,0.1c-1.7,1-2.8,2.2-3.2,3.5l-1.5-0.3c-0.2,0-0.5,0-0.6,0.1l0,0l-1.3,0.7
|
||||
c-0.3,0.1-0.3,0.4,0,0.5l15.1,7.8c0.3,0.1,0.7,0.1,0.9,0l0,0l2.6-1.4c0.3-0.1,0.3-0.4,0-0.5l-11.9-6.2
|
||||
c0.4-0.9,1.2-1.7,2.4-2.3h0.1c1.4-0.7,2.8-0.9,4.3-0.1l10.9,5.6c0.3,0.1,0.7,0.1,1,0l2.6-1.4c0.3-0.1,0.3-0.4,0-0.5
|
||||
l-12-6.2c0.4-0.9,1.2-1.7,2.4-2.3c0,0,0,0,0.1,0c1.4-0.7,2.8-0.9,4.3-0.1l10.9,5.6c0.3,0.1,0.7,0.1,0.9,0l0,0l2.6-1.4
|
||||
c0.3-0.1,0.3-0.4,0-0.5l-10.9-5.6C1163.1,893.1,1159.6,892.8,1155.9,894.8"/>
|
||||
<path class="st67" d="M1187.2,892.3c-1.2,0.6-2.7,1.1-4.3,1.3l-8.9-4.6c0.4-0.9,1.3-1.7,2.5-2.4c0,0,0,0,0.1,0
|
||||
c3.1-1.7,6-0.7,8.9,0.8s4.9,3,1.7,4.7l0,0C1187.3,892.3,1187.3,892.3,1187.2,892.3 M1165.6,885.2l-2.6,1.4
|
||||
c-0.3,0.1-0.3,0.4,0,0.5l19.6,10.1c0.3,0.1,0.7,0.1,0.9,0l0,0l1.3-0.7c0.2-0.1,0.2-0.2,0.2-0.4l-0.6-0.8
|
||||
c2.5-0.2,4.8-0.9,6.6-1.8c0.1,0,0.2-0.1,0.3-0.1c4.7-2.5,3.2-5.1-2-7.8s-10.1-3.4-14.7-0.9c0,0-0.1,0-0.1,0.1
|
||||
c-1.5,0.8-2.6,1.9-3,3l-4.9-2.5C1166.3,885,1165.8,885,1165.6,885.2"/>
|
||||
<path class="st67" d="M1193,874.6C1193,874.6,1192.9,874.6,1193,874.6c-0.1,0.1-0.1,0.1-0.2,0.1c-1.8,1-3,2.2-3.3,3.6
|
||||
l-1.5-0.3c-0.2,0-0.5,0-0.7,0.1l-1.3,0.7c-0.3,0.1-0.3,0.4,0,0.5l15.1,7.8c0.3,0.1,0.7,0.1,0.9,0l0,0l2.6-1.4
|
||||
c0.3-0.1,0.3-0.4,0-0.5l-11.9-6.2c0.5-1,1.5-1.9,2.9-2.6c0.1,0,0.2-0.1,0.2-0.1c0.1,0,0.1-0.1,0.2-0.1
|
||||
c0.3-0.2,0.7-0.4,1.1-0.5l0,0l0,0c0.3-0.1,0.3-0.4,0-0.5l-1.9-1c-0.3-0.1-0.8-0.2-1.1-0.1
|
||||
C1193.8,874.2,1193.4,874.4,1193,874.6"/>
|
||||
<path class="st67" d="M1217,876.3c-1.9,1-3.6,0.7-4.8,0.1c-1.7-0.9-1.3-1.7,0.1-2.7l3-2l4.2,2.1
|
||||
C1219.1,874.7,1218.3,875.6,1217,876.3C1217,876.2,1217,876.2,1217,876.3 M1203.9,868.6c-0.1,0-0.1,0.1-0.2,0.1
|
||||
c-1.7,0.9-3.1,2-4.1,3.1c-0.1,0.1-0.1,0.3,0.1,0.4l2.1,1.1c0.3,0.1,0.7,0.1,0.9,0l0,0l0.1-0.1c0.9-1,2.1-1.9,3.6-2.8
|
||||
c0.1,0,0.1-0.1,0.2-0.1c2.3-1.2,3.6-1.3,5.2-0.4l0.8,0.4l-3.3,2.1c-3.3,2.1-4.1,4.1-0.6,5.9c2.6,1.3,6.4,1.9,10.5-0.3
|
||||
c0,0,0.1,0,0.1-0.1c1.7-1,2.9-2.2,3.1-3.5l1.5,0.3c0.2,0,0.5,0,0.6-0.1l0,0l1.3-0.7c0.3-0.1,0.3-0.4,0-0.5l-10.2-5.3
|
||||
C1212.5,866.4,1209,865.9,1203.9,868.6"/>
|
||||
<path class="st67" d="M1222.3,858.6c-0.1,0.1-0.3,0.2-0.4,0.2c-5.7,3.1-4,5.8,1,8.4c5,2.6,10.1,3.4,15.7,0.4
|
||||
c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1-0.1c1.4-0.7,2.5-1.6,3.3-2.5c0.1-0.1,0-0.3-0.2-0.4l-2.1-1.1c-0.3-0.1-0.7-0.1-1,0
|
||||
l-0.1,0.1l0,0c-0.8,0.8-1.8,1.5-3,2.2c0,0,0,0-0.1,0h-0.1c-3.1,1.6-6.1,1-9.2-0.6s-4.3-3.2-1.2-4.9
|
||||
c0.1-0.1,0.2-0.1,0.3-0.2c1.1-0.6,2.4-1.1,3.8-1.5l0.2-0.1c0.3-0.1,0.3-0.4,0-0.5l-2.1-1.1c-0.2-0.1-0.5-0.1-0.7-0.1
|
||||
C1225.1,857.4,1223.6,857.9,1222.3,858.6"/>
|
||||
<path class="st67" d="M1263.4,833.5l-3.2,1.7l-0.9,5.5l2.8,0.2c0.1,0,0.3,0,0.5,0s0.4-0.1,0.6-0.1c0.1,0,0.2-0.1,0.3-0.1
|
||||
c0.1,0,0.2-0.1,0.3-0.2c0.1-0.1,0.2-0.3,0.3-0.4l0.3-2c0.2,0.1,0.4,0.3,0.7,0.4c0.2,0.1,0.5,0.2,0.7,0.4l9.1,4.7
|
||||
l-3.5,1.9l2.8,1.4l10.3-5.6l-2.8-1.4l-3,1.6L1263.4,833.5"/>
|
||||
<path class="st67" d="M1275,827C1275,827,1274.9,827,1275,827c-0.9,0.5-1.6,1-2.1,1.5s-0.8,1-0.9,1.6
|
||||
c-0.1,0.5,0,1.1,0.3,1.6c0.3,0.6,0.8,1.1,1.6,1.6l2.4-0.9c0.2-0.1,0.4-0.2,0.5-0.2c0.3-0.2,0.5-0.3,0.6-0.5
|
||||
s0.1-0.5-0.2-0.8c-0.3-0.3-0.4-0.7-0.3-1c0.1-0.4,0.4-0.7,1-1c0,0,0,0,0.1,0c0.7-0.4,1.4-0.5,2.1-0.5s1.4,0.2,2.2,0.6
|
||||
c0.4,0.2,0.8,0.5,1.1,0.7c0.3,0.3,0.5,0.6,0.7,0.9c0.2,0.3,0.3,0.7,0.4,1.1c0.1,0.4,0.1,0.8,0.1,1.3l0.1,5.5
|
||||
c0,0.2,0.1,0.5,0.2,0.7c0.2,0.2,0.4,0.4,0.6,0.5l1.2,0.6l12.6-6.9l-2.2-1.2c-0.4-0.2-0.8-0.3-1.3-0.3s-0.9,0.1-1.3,0.3
|
||||
l0,0l-3.4,1.8c-0.4,0.2-0.8,0.5-1.1,0.7c-0.4,0.3-0.7,0.6-1,0.9l-0.1-3.8c0-0.5,0-1-0.1-1.5s-0.2-0.9-0.4-1.4
|
||||
c-0.2-0.4-0.5-0.9-0.8-1.2c-0.4-0.4-0.9-0.8-1.6-1.1c-0.8-0.4-1.6-0.7-2.5-0.9s-1.8-0.3-2.8-0.2c-1,0-1.9,0.2-2.9,0.4
|
||||
C1276.7,826.2,1275.8,826.6,1275,827"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000055674499937063148610000004306812927114920883_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000004518033045209089300000016218411321581577390_">
|
||||
<use xlink:href="#SVGID_00000055674499937063148610000004306812927114920883_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000004518033045209089300000016218411321581577390_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1103.5,416.5 1210.5,478.5 868.5,675.5 1180.8,856.6 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000026123715033495807140000003180914406214489771_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000083798441028463063870000003796223072503923082_">
|
||||
<use xlink:href="#SVGID_00000026123715033495807140000003180914406214489771_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000083798441028463063870000003796223072503923082_);fill:#FF9600;" points="526,819.6
|
||||
440.1,870.9 526,923.4 612,871.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000111883979398437530060000001831383631585137839_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000098222490173758375790000012838647409064945039_">
|
||||
<use xlink:href="#SVGID_00000111883979398437530060000001831383631585137839_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000098222490173758375790000012838647409064945039_);fill:#F3EAE4;" cx="1104.5" cy="416.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -12,9 +12,7 @@
|
||||
scope.authenticated = null;
|
||||
scope.user = null;
|
||||
scope.avatar = [
|
||||
{ value: "assets/img/application/logo.png" },
|
||||
{ value: "assets/img/application/logo@2x.png" },
|
||||
{ value: "assets/img/application/logo@3x.png" }
|
||||
{ value: "assets/img/application/logo.svg" }
|
||||
];
|
||||
scope.hideBackofficeLogo = Umbraco.Sys.ServerVariables.umbracoSettings.hideBackofficeLogo;
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
vm.backgroundImage = Umbraco.Sys.ServerVariables.umbracoSettings.loginBackgroundImage;
|
||||
vm.logoImage = Umbraco.Sys.ServerVariables.umbracoSettings.loginLogoImage;
|
||||
vm.logoImageAlternative = Umbraco.Sys.ServerVariables.umbracoSettings.loginLogoImageAlternative;
|
||||
vm.allowPasswordReset = Umbraco.Sys.ServerVariables.umbracoSettings.canSendRequiredEmail && Umbraco.Sys.ServerVariables.umbracoSettings.allowPasswordReset;
|
||||
vm.usernameIsEmail = Umbraco.Sys.ServerVariables.umbracoSettings.usernameIsEmail;
|
||||
|
||||
|
||||
@@ -30,9 +30,7 @@ Use this directive to render an avatar.
|
||||
var vm = this;
|
||||
|
||||
vm.avatar = [
|
||||
{ value: "assets/logo.png" },
|
||||
{ value: "assets/logo@2x.png" },
|
||||
{ value: "assets/logo@3x.png" }
|
||||
{ value: "assets/img/application/logo.svg" }
|
||||
];
|
||||
|
||||
}
|
||||
@@ -55,7 +53,7 @@ Use this directive to render an avatar.
|
||||
function AvatarDirective(localizationService) {
|
||||
|
||||
function link(scope, element, attrs, ctrl) {
|
||||
|
||||
|
||||
var eventBindings = [];
|
||||
scope.initials = "";
|
||||
scope.avatarAlt = "";
|
||||
|
||||
@@ -366,7 +366,7 @@ function entityResource($q, $http, umbRequestHelper) {
|
||||
'Failed to retrieve entity data for query ' + query);
|
||||
},
|
||||
|
||||
getDynamicRoot: function (query, currentId, parentId) {
|
||||
getDynamicRoot: function (query, currentId, parentId, culture, segment) {
|
||||
return umbRequestHelper.resourcePromise(
|
||||
$http.post(
|
||||
umbRequestHelper.getApiUrl(
|
||||
@@ -375,7 +375,9 @@ function entityResource($q, $http, umbRequestHelper) {
|
||||
{
|
||||
query: JSON.parse(query),
|
||||
parentId: parentId,
|
||||
currentId: currentId
|
||||
currentId: currentId,
|
||||
currentCulture: culture,
|
||||
currentSegment: segment
|
||||
}),
|
||||
'Failed to retrieve entity data for query ' + query);
|
||||
},
|
||||
|
||||
@@ -156,7 +156,9 @@ angular.module('umbraco.services')
|
||||
lastServerTimeoutSet = null;
|
||||
currentUser = null;
|
||||
|
||||
openLoginDialog(isLogout === undefined ? true : !isLogout);
|
||||
if (!isLogout) {
|
||||
openLoginDialog(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Register a handler for when an item is added to the retry queue
|
||||
@@ -231,15 +233,11 @@ angular.module('umbraco.services')
|
||||
|
||||
return authResource.performLogout()
|
||||
.then(function (data) {
|
||||
userAuthExpired();
|
||||
userAuthExpired(true);
|
||||
|
||||
if (data && data.signOutRedirectUrl) {
|
||||
$window.location.replace(data.signOutRedirectUrl);
|
||||
}
|
||||
else {
|
||||
//done!
|
||||
return null;
|
||||
}
|
||||
const signOutRedirectUrl = data && data.signOutRedirectUrl ? data.signOutRedirectUrl : 'login?logout=true';
|
||||
|
||||
$window.location.replace(signOutRedirectUrl);
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -296,10 +296,6 @@ section article>div {
|
||||
}
|
||||
|
||||
section .logo {
|
||||
background-image: url(../img/logo.png);
|
||||
background-repeat: no-repeat;
|
||||
width: 91px;
|
||||
height: 91px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ function MainController($scope, $location, appState, treeService, notificationsS
|
||||
evts.push(eventsService.on("app.notAuthenticated", function (evt, data) {
|
||||
$scope.authenticated = null;
|
||||
$scope.user = null;
|
||||
const isTimedOut = data && data.isTimedOut ? true : false;
|
||||
const isTimedOut = !!(data && data.isTimedOut);
|
||||
|
||||
$scope.showLoginScreen(isTimedOut);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
window.app.config(function ($routeProvider) {
|
||||
|
||||
|
||||
/**
|
||||
* This determines if the route can continue depending on authentication and initialization requirements
|
||||
* @param {boolean} authRequired If true, it checks if the user is authenticated and will resolve successfully
|
||||
@@ -82,9 +82,6 @@ window.app.config(function ($routeProvider) {
|
||||
return {
|
||||
isLoggedOut: function ($q, $location, userService) {
|
||||
return userService.logout().then(function () {
|
||||
// we have to redirect here instead of the routes redirectTo
|
||||
// https://github.com/angular/angular.js/commit/7f4b356c2bebb87f0c26b57a20415b004b20bcd1
|
||||
$location.path("/login/false");
|
||||
//success so continue
|
||||
return $q.when(true);
|
||||
}, function() {
|
||||
@@ -117,9 +114,9 @@ window.app.config(function ($routeProvider) {
|
||||
template: "<div ng-include='templateUrl'></div>",
|
||||
//This controller will execute for this route, then we can execute some code in order to set the template Url
|
||||
controller: function ($scope, $route, $routeParams, $location, sectionService) {
|
||||
|
||||
|
||||
//We are going to check the currently loaded sections for the user and if the section we are navigating
|
||||
//to has a custom route path we'll use that
|
||||
//to has a custom route path we'll use that
|
||||
sectionService.getSectionsForUser().then(function(sections) {
|
||||
//find the one we're requesting
|
||||
var found = _.find(sections, function(s) {
|
||||
@@ -199,7 +196,7 @@ window.app.config(function ($routeProvider) {
|
||||
})
|
||||
.otherwise({ redirectTo: '/login' });
|
||||
}).config(function ($locationProvider) {
|
||||
|
||||
|
||||
$locationProvider.html5Mode(false); //turn html5 mode off
|
||||
$locationProvider.hashPrefix('');
|
||||
});
|
||||
|
||||
@@ -36,7 +36,17 @@
|
||||
<div class="flex flex-column flx-gap-sm">
|
||||
<div ng-repeat="login in vm.externalLoginProviders">
|
||||
|
||||
<umb-custom-view ng-if="login.customView" custom-view="{{ ::login.customView }}"></umb-custom-view>
|
||||
<umb-custom-view
|
||||
ng-if="login.customView"
|
||||
ng-attr-custom-view="{{ ::login.customView }}"
|
||||
ng-attr-args='{{"{" +
|
||||
"\"providerName\": \"" + login.authType + "\"," +
|
||||
"\"displayName\": \"" + login.caption + "\"," +
|
||||
"\"externalLoginUrl\": \"" + vm.externalLinkLoginFormAction + "\"," +
|
||||
"\"userViewState\": \"loggedIn\"" +
|
||||
"}"
|
||||
| safe_html }}'>
|
||||
</umb-custom-view>
|
||||
|
||||
<div ng-if="!login.customView">
|
||||
<form action="{{ ::vm.externalLinkLoginFormAction }}" id="oauthloginform-{{ ::login.authType }}" method="POST"
|
||||
@@ -99,7 +109,7 @@
|
||||
<div class="umb-control-group" ng-if="vm.dashboard.length > 0">
|
||||
<div ng-repeat="tab in vm.dashboard">
|
||||
<h5 ng-if="tab.label">{{tab.label}}</h5>
|
||||
<div ng-repeat="property in tab.options">
|
||||
<div ng-repeat="property in tab.properties">
|
||||
<div ng-include="property.view"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
ng-focus="keepLogoModal()"
|
||||
ng-blur="hideLogoModal()"
|
||||
ng-if="logoModal.show">
|
||||
<img src="assets/img/application/umbraco_logo_large_blue.svg"
|
||||
<img src="assets/img/application/logo.svg"
|
||||
alt="Umbraco — The Friendly CMS"
|
||||
width="120"
|
||||
draggable="false" />
|
||||
@@ -122,7 +122,6 @@
|
||||
color="secondary"
|
||||
name="{{user.name}}"
|
||||
img-src="{{avatar[0].value}}"
|
||||
img-srcset="{{avatar[1].value}} 2x, {{avatar[2].value}} 3x"
|
||||
>
|
||||
</umb-avatar>
|
||||
</button>
|
||||
|
||||
@@ -1,27 +1,29 @@
|
||||
<div class="login-overlay">
|
||||
<div id="login" class="umb-modalcolumn umb-dialog" ng-cloak>
|
||||
<umb-auth
|
||||
logo-image="{{ ::vm.logoImage }}"
|
||||
background-image="{{ ::vm.backgroundImage }}"
|
||||
ng-attr-logo-image="{{ ::vm.logoImage }}"
|
||||
ng-attr-logo-image-alternative="{{ ::vm.logoImageAlternative }}"
|
||||
ng-attr-background-image="{{ ::vm.backgroundImage }}"
|
||||
ng-attr-username-is-email="{{ ::vm.usernameIsEmail || undefined }}"
|
||||
ng-attr-allow-password-reset="{{ ::vm.allowPasswordReset || undefined }}"
|
||||
ng-attr-disable-local-login="{{ ::vm.disableLocalLogin || undefined }}"
|
||||
return-url=""
|
||||
ng-on-umb-login-success="vm.onLoginSuccess($event)"
|
||||
>
|
||||
<p ng-if="vm.isTimedOut" slot="subheadline">
|
||||
<localize key="login_timeout">Log in below</localize>.
|
||||
</p>
|
||||
<span ng-if="vm.isTimedOut" slot="subheadline">
|
||||
<umb-localize key="login_timeout">Log in below</umb-localize>.
|
||||
</span>
|
||||
<umb-external-login-provider
|
||||
ng-repeat="login in vm.externalLoginProviders"
|
||||
slot="external"
|
||||
display-name="{{ ::login.caption }}"
|
||||
provider-name="{{ ::login.authType }}"
|
||||
ng-attr-display-name="{{ ::login.caption }}"
|
||||
ng-attr-provider-name="{{ ::login.authType }}"
|
||||
ng-attr-custom-view="{{ ::login.customView }}"
|
||||
ng-attr-icon="{{ ::login.options.icon }}"
|
||||
external-login-url="{{ ::vm.externalLoginFormAction }}"
|
||||
button-look="{{ ::login.options.buttonLook }}"
|
||||
button-color="{{ ::login.options.buttonColor }}"
|
||||
ng-attr-button-look="{{ ::login.options.buttonLook }}"
|
||||
ng-attr-button-color="{{ ::login.options.buttonColor }}"
|
||||
ng-attr-user-view-state="{{ ::vm.isTimedOut ? 'timedOut' : 'loggedOut' }}"
|
||||
></umb-external-login-provider>
|
||||
</umb-auth>
|
||||
</div>
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<main class="error-container">
|
||||
<img src="/umbraco/assets/img/application/umbraco_logomark_white.svg"
|
||||
<img src="/umbraco/assets/img/application/logo_white.svg"
|
||||
alt="Umbraco"
|
||||
width="30"
|
||||
height="30"
|
||||
|
||||
@@ -257,11 +257,13 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso
|
||||
});
|
||||
}
|
||||
else if ($scope.model.config.startNode.dynamicRoot) {
|
||||
|
||||
entityResource.getDynamicRoot(
|
||||
JSON.stringify($scope.model.config.startNode.dynamicRoot),
|
||||
editorState.current.id,
|
||||
editorState.current.parentId,
|
||||
"Document"
|
||||
$scope.model.culture,
|
||||
$scope.model.segment
|
||||
).then(function (ent) {
|
||||
if(ent) {
|
||||
dialogOptions.startNodeId = ($scope.model.config.idType === "udi" ? ent.udi : ent.id).toString();
|
||||
|
||||
@@ -1,56 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<base href="/" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Umbraco</title>
|
||||
<script type="module">
|
||||
import { startMockServiceWorker } from './src/mocks/index.ts';
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<base href="/"/>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||
<meta name="robots" content="noindex, nofollow"/>
|
||||
<meta name="pinterest" content="nopin"/>
|
||||
<title>Umbraco</title>
|
||||
<script type="module">
|
||||
import {startMockServiceWorker} from './src/mocks/index.ts';
|
||||
|
||||
if (import.meta.env.DEV) {
|
||||
await startMockServiceWorker();
|
||||
}
|
||||
</script>
|
||||
<script type="module" src="/src/external.ts"></script>
|
||||
<script type="module" src="/src/index.ts"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="uui-font uui-text" style="margin: 0; padding: 0; overflow: hidden">
|
||||
<umb-backoffice-icon-registry>
|
||||
<umb-auth
|
||||
logo-image="/umbraco_logo_white.svg"
|
||||
background-image="/login.svg"
|
||||
allow-password-reset
|
||||
allow-user-invite>
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="Google"
|
||||
provider-name="Umbraco.Google"
|
||||
icon="icon-google-fill"
|
||||
external-logins-url="https://google.com"
|
||||
button-look="primary"
|
||||
button-color="positive"></umb-external-login-provider>
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="Azure ID"
|
||||
provider-name="Umbraco.Azure"
|
||||
icon="lock"
|
||||
external-logins-url="https://microsoft.com"
|
||||
button-look="primary"
|
||||
button-color="warning"></umb-external-login-provider>
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="My provider"
|
||||
provider-name="MyCustomScheme"
|
||||
custom-view="/src/mocks/customViews/my-custom-view.js"></umb-external-login-provider>
|
||||
</umb-auth>
|
||||
</umb-backoffice-icon-registry>
|
||||
</body>
|
||||
if (import.meta.env.DEV) {
|
||||
await startMockServiceWorker();
|
||||
}
|
||||
</script>
|
||||
<script type="module" src="/src/external.ts"></script>
|
||||
<script type="module" src="/src/index.ts"></script>
|
||||
</head>
|
||||
<body class="uui-font uui-text" style="margin: 0; padding: 0; overflow: hidden">
|
||||
<noscript>
|
||||
<style>
|
||||
#noscript-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
padding: 0 20px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<div id="noscript-container">
|
||||
<h1 class="uui-h3" style="display: inline-flex; align-items: center; gap: 10px">
|
||||
<img aria-hidden="true" alt="logo" src="/favicon.svg" style="width: 30px" />
|
||||
<span>Umbraco</span>
|
||||
</h1>
|
||||
<p>For full functionality of Umbraco CMS it is necessary to enable JavaScript.</p>
|
||||
<p>Here are the <a href="https://www.enable-javascript.com/" target="_blank" rel="noopener" style="text-decoration: underline;">instructions how to enable JavaScript in your web browser</a>.</p>
|
||||
</div>
|
||||
</noscript>
|
||||
<umb-backoffice-icon-registry>
|
||||
<umb-auth
|
||||
logo-image="/logo_dark.svg"
|
||||
logo-image-alternative="/logo_dark.svg"
|
||||
background-image="/login.jpg"
|
||||
username-is-email="true"
|
||||
allow-password-reset
|
||||
allow-user-invite>
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="Google"
|
||||
provider-name="Umbraco.Google"
|
||||
icon="icon-google-fill"
|
||||
external-logins-url="https://google.com"></umb-external-login-provider>
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="Azure ID"
|
||||
provider-name="Umbraco.Azure"
|
||||
icon="lock"
|
||||
external-logins-url="https://microsoft.com"></umb-external-login-provider>
|
||||
<umb-external-login-provider
|
||||
slot="external"
|
||||
display-name="My provider"
|
||||
provider-name="MyCustomScheme"
|
||||
custom-view="/src/mocks/customViews/my-custom-view.js"></umb-external-login-provider>
|
||||
</umb-auth>
|
||||
</umb-backoffice-icon-registry>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
1
src/Umbraco.Web.UI.Login/public/login.jpg
Symbolic link
@@ -0,0 +1 @@
|
||||
../../Umbraco.Web.UI.Client/src/assets/img/login.jpg
|
||||
@@ -1,996 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1920 1164" style="enable-background:new 0 0 1920 1164;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#162335;}
|
||||
.st1{opacity:0.15;clip-path:url(#SVGID_00000090293870806755067250000000317586838450182291_);}
|
||||
.st2{fill:#F3EAE4;}
|
||||
.st3{clip-path:url(#SVGID_00000070113695316645383610000001712759489273656489_);fill:#FFBDB9;}
|
||||
.st4{clip-path:url(#SVGID_00000075843369450780882590000018304811172571820694_);fill:#A27F50;}
|
||||
.st5{clip-path:url(#SVGID_00000114034649374907102010000012501853726559711373_);fill:#3145B7;}
|
||||
.st6{clip-path:url(#SVGID_00000127037541451816541270000016371668593058341040_);fill:#FFD300;}
|
||||
.st7{clip-path:url(#SVGID_00000091008438605608225920000000315481828206359465_);fill:#FF9600;}
|
||||
.st8{clip-path:url(#SVGID_00000042721456288192175210000017252967253312151945_);fill:#F3EAE4;}
|
||||
.st9{clip-path:url(#SVGID_00000174559905860832418740000005930937852351674762_);fill:#FF9600;}
|
||||
.st10{clip-path:url(#SVGID_00000065791090563711400540000010729552114256640928_);fill:#FFD300;}
|
||||
.st11{clip-path:url(#SVGID_00000062180740900565005160000014289549524927882152_);fill:#3145B7;}
|
||||
.st12{clip-path:url(#SVGID_00000021833513224660800930000015167875017063112895_);fill:#3145B7;}
|
||||
.st13{clip-path:url(#SVGID_00000163752188322379460200000014798754354093305274_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st14{clip-path:url(#SVGID_00000028317097161535322600000003200059692132963474_);fill:#A27F50;}
|
||||
.st15{clip-path:url(#SVGID_00000039108951912012441520000017084405196299693957_);fill:#F3EAE4;}
|
||||
.st16{clip-path:url(#SVGID_00000157987525770752761490000013542556672184759980_);}
|
||||
.st17{fill:#FFFFFF;}
|
||||
.st18{fill:#3544B1;}
|
||||
.st19{clip-path:url(#SVGID_00000091703280769569818000000010335507978643512228_);fill:#F3EAE4;}
|
||||
.st20{clip-path:url(#SVGID_00000060030161443498345100000005552921972525717690_);fill:#F3EAE4;}
|
||||
.st21{clip-path:url(#SVGID_00000110457175270969588530000008326702304618511236_);fill:#F3EAE4;}
|
||||
.st22{clip-path:url(#SVGID_00000029739674117829278330000003779816123607768967_);fill:#F3EAE4;}
|
||||
.st23{clip-path:url(#SVGID_00000026849832425217534260000004636316856488745875_);fill:#F3EAE4;}
|
||||
.st24{clip-path:url(#SVGID_00000116917663594767186610000001578964402888997311_);fill:#F3EAE4;}
|
||||
.st25{clip-path:url(#SVGID_00000020390687939977957210000017888699008171536567_);fill:#F3EAE4;}
|
||||
.st26{clip-path:url(#SVGID_00000003808154914975360100000016909747310715974570_);fill:#F3EAE4;}
|
||||
.st27{clip-path:url(#SVGID_00000062169895112765073370000013538511770730444717_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st28{clip-path:url(#SVGID_00000039843819757838035890000014952353533090789539_);fill:#3145B7;}
|
||||
.st29{clip-path:url(#SVGID_00000099622440703124522590000002015578837295386764_);fill:#3145B7;}
|
||||
.st30{clip-path:url(#SVGID_00000031920499672808860590000017610435297387704966_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st31{clip-path:url(#SVGID_00000005952946952662073040000017888004863064174225_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st32{clip-path:url(#SVGID_00000082336303615642129200000004303792997334875807_);fill:#3145B7;}
|
||||
.st33{clip-path:url(#SVGID_00000158022921070923414790000013365080768646084024_);fill:#FFBDB9;}
|
||||
.st34{clip-path:url(#SVGID_00000055686146885346621100000000179325491043175610_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st35{clip-path:url(#SVGID_00000052813346379009156530000004922920765573750151_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st36{clip-path:url(#SVGID_00000129905332388902522290000014385566074184355517_);fill:#FF9600;}
|
||||
.st37{display:none;}
|
||||
.st38{display:inline;}
|
||||
.st39{clip-path:url(#SVGID_00000158022330813853105950000007657820932599079582_);fill:#3145B7;}
|
||||
.st40{clip-path:url(#SVGID_00000094607308816606182360000008687096036294449024_);fill:#F3EAE4;}
|
||||
.st41{clip-path:url(#SVGID_00000056395133295577587630000008837991618149312901_);fill:#FFD300;}
|
||||
.st42{clip-path:url(#SVGID_00000019661639217342865990000009233089476329617806_);fill:#F3EAE4;}
|
||||
.st43{clip-path:url(#SVGID_00000059299243084970535850000002182865148877870469_);fill:#FF9600;}
|
||||
.st44{clip-path:url(#SVGID_00000011752712870160810620000005187202262485773729_);fill:#FFBDB9;}
|
||||
.st45{clip-path:url(#SVGID_00000090979366369002677930000010283540804097392550_);fill:#FFD300;}
|
||||
.st46{clip-path:url(#SVGID_00000027575873363329459850000006702558975383226800_);fill:#FFBDB9;}
|
||||
.st47{clip-path:url(#SVGID_00000121265087618356283780000004575120213201557950_);fill:#A27F50;}
|
||||
.st48{clip-path:url(#SVGID_00000151513739239955657730000007881363040184376739_);fill:#F3EAE4;}
|
||||
.st49{clip-path:url(#SVGID_00000158011583716730457190000007434161654466355337_);}
|
||||
.st50{clip-path:url(#SVGID_00000173121351737293248970000007382609512645786008_);fill:#F3EAE4;}
|
||||
.st51{clip-path:url(#SVGID_00000053543486661402211190000009049354371535394229_);fill:#F3EAE4;}
|
||||
.st52{clip-path:url(#SVGID_00000114045990286884446730000016411874908029891747_);fill:#F3EAE4;}
|
||||
.st53{clip-path:url(#SVGID_00000061432217720344096580000001086655428742766721_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st54{clip-path:url(#SVGID_00000029022101935107221860000007900443689338981505_);fill:#3145B7;}
|
||||
.st55{clip-path:url(#SVGID_00000158749784546363628160000007132654974501017781_);fill:#3145B7;}
|
||||
.st56{clip-path:url(#SVGID_00000047771193418432778300000007364612500109819065_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st57{clip-path:url(#SVGID_00000027598422104023127670000017536641365182917778_);fill:#F3EAE4;}
|
||||
.st58{clip-path:url(#SVGID_00000145057228657985445070000009833495665326229676_);fill:#3145B7;}
|
||||
.st59{clip-path:url(#SVGID_00000164510783797795358920000001297447488505271169_);fill:#FFBDB9;}
|
||||
.st60{clip-path:url(#SVGID_00000183210534738960289470000012549520974992092605_);fill:#FF9600;}
|
||||
.st61{clip-path:url(#SVGID_00000145033303631728425180000018242923401148984729_);fill:#FF9600;}
|
||||
.st62{clip-path:url(#SVGID_00000181058607705335751820000017109601273387990711_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st63{clip-path:url(#SVGID_00000003803945813288096500000013297607200281059724_);fill:#FFFFFF;}
|
||||
.st64{clip-path:url(#SVGID_00000066490804380119822450000000238697413927315847_);}
|
||||
.st65{enable-background:new ;}
|
||||
.st66{clip-path:url(#SVGID_00000026850991908260154970000002729197413015215752_);}
|
||||
.st67{fill:#3544AF;}
|
||||
.st68{clip-path:url(#SVGID_00000106119462739386678340000000075329083703506623_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;}
|
||||
.st69{clip-path:url(#SVGID_00000148620075436344653540000000060441797712170932_);fill:#FF9600;}
|
||||
.st70{clip-path:url(#SVGID_00000172421713886179014920000013417145008224878489_);fill:#F3EAE4;}
|
||||
</style>
|
||||
<g id="BG">
|
||||
<g>
|
||||
<rect class="st0" width="1920" height="1164"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Grid">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000066508109028710391750000002760786598431068833_">
|
||||
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<g id="XMLID_00000169553296605018520650000009583362662613329074_" style="opacity:0.15;clip-path:url(#SVGID_00000066508109028710391750000002760786598431068833_);">
|
||||
<g id="XMLID_00000089533767977427416860000002856307549709686712_">
|
||||
<polygon id="XMLID_00000020386790585824403190000017984947571202498464_" class="st2" points="1046.2,-602 -149.3,88.2
|
||||
-150.5,87.5 1044.9,-602.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000079485464328753927070000017344551978158930853_">
|
||||
<g id="XMLID_00000105396543925583186770000010007617077871067064_">
|
||||
<polygon id="XMLID_00000030447176062218687610000011280814739186361244_" class="st2" points="3084.1,574.6 1888.6,1264.8
|
||||
1887.3,1264 3082.8,573.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000074430583175465043050000014465236438230282924_">
|
||||
<g id="XMLID_00000088130056824636874240000002464213041115755943_">
|
||||
<polygon id="XMLID_00000062175903925239596000000008041680726996673446_" class="st2" points="869.7,676.4 -325.7,1366.6
|
||||
-327,1365.9 868.5,675.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000083069549404367248860000007217742145287901589_">
|
||||
<polygon id="XMLID_00000008139291666922122570000012102126541959940769_" class="st2" points="1039.6,774.5 -155.9,1464.7
|
||||
-157.2,1463.9 1038.3,773.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000021797759130191935540000017706669620804642213_">
|
||||
<polygon id="XMLID_00000021085076175625815590000012977775825311568830_" class="st2" points="1209.4,872.5 13.9,1562.7
|
||||
12.6,1562 1208.1,871.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000011029401244887712300000004018912544120840094_">
|
||||
<polygon id="XMLID_00000060711519009022682130000005888609043029195941_" class="st2" points="1379.2,970.6 183.7,1660.8
|
||||
182.5,1660 1377.9,969.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000008845042768853454300000006107721104721923984_">
|
||||
<polygon id="XMLID_00000159448461406785226410000011154189825773772424_" class="st2" points="1549,1068.6 353.6,1758.8
|
||||
352.3,1758.1 1547.7,1067.9 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000183938260474069450590000005733445126966918040_">
|
||||
<polygon id="XMLID_00000109027559143075142070000003275257065592299692_" class="st2" points="1205.2,1658.6 1203.9,1659.3
|
||||
185,1071 186.3,1070.3 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000181785703601070526200000018271999443858828458_">
|
||||
<polygon id="XMLID_00000176730513543404402920000005219528788391774140_" class="st2" points="1375.9,1560 1374.6,1560.8
|
||||
355.7,972.5 357,971.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000098900167758876521400000007256897303825822899_">
|
||||
<polygon id="XMLID_00000123414029494862687430000011295825590158006663_" class="st2" points="1546.6,1461.5 1545.3,1462.2
|
||||
526.4,873.9 527.7,873.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000120541844177750148960000015765172927395996335_">
|
||||
<polygon id="XMLID_00000091009740777232208480000004997513642232138126_" class="st2" points="1717.3,1362.9 1716,1363.7
|
||||
697,775.4 698.3,774.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000118355078533686810820000003100777614129437325_">
|
||||
<polygon id="XMLID_00000166672215177793308500000005674963425617888901_" class="st2" points="1887.9,1264.4 1886.6,1265.2
|
||||
867.7,676.9 869,676.1 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000039132575836957327170000013353388136977081229_">
|
||||
<polygon id="XMLID_00000040548753926414093050000009132634391083360444_" class="st2" points="1888.6,1264 1887.3,1264.8
|
||||
868.4,676.5 869.7,675.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000170252114345429024420000005520947815301686151_">
|
||||
<polygon id="XMLID_00000169523348876260283860000016897506182633037736_" class="st2" points="2065.1,-13.7 869.7,676.5
|
||||
868.4,675.7 2063.9,-14.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000043422792016811913920000002463899567321544088_">
|
||||
<polygon id="XMLID_00000035503190491679368530000006108738000028088226_" class="st2" points="2235,84.3 1039.5,774.5
|
||||
1038.2,773.8 2233.7,83.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000156583662898040535930000009947452185944681871_">
|
||||
<polygon id="XMLID_00000173849494843523431030000012378568542357647267_" class="st2" points="2404.8,182.4 1209.3,872.6
|
||||
1208,871.8 2403.5,181.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000145765834912961207760000006429975694617969327_">
|
||||
<polygon id="XMLID_00000034058892427085389630000011940217923393613186_" class="st2" points="2574.6,280.4 1379.1,970.6
|
||||
1377.9,969.9 2573.3,279.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000136404070384164422290000016741913111589034157_">
|
||||
<polygon id="XMLID_00000118384633024219384660000005186074227492587917_" class="st2" points="2744.4,378.5 1549,1068.7
|
||||
1547.7,1067.9 2743.1,377.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000005247398313954491530000015532925810583642251_">
|
||||
<polygon id="XMLID_00000091001475206582501090000008487252876912167816_" class="st2" points="2914.2,476.5 1718.8,1166.7
|
||||
1717.5,1166 2913,475.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000137123563281348051350000016734458728433029760_">
|
||||
<polygon id="XMLID_00000168833887534346560560000010059870189874967738_" class="st2" points="2059.3,1165.5 2058,1166.2
|
||||
1039.1,577.9 1040.3,577.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000168095860651493586530000017646707311662482853_">
|
||||
<polygon id="XMLID_00000065760007464936870980000017678622537967898044_" class="st2" points="2230,1066.9 2228.7,1067.7
|
||||
1209.7,479.4 1211,478.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000157292286247854109570000001441054465897594779_">
|
||||
<polygon id="XMLID_00000160171263507890820760000005497286094216786572_" class="st2" points="2400.6,968.4 2399.3,969.1
|
||||
1380.4,380.9 1381.7,380.1 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000085209890575466928280000010377678481953940648_">
|
||||
<polygon id="XMLID_00000044173582130028286200000001537620779878779817_" class="st2" points="2571.3,869.9 2570,870.6
|
||||
1551.1,282.3 1552.4,281.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000136369159460067149300000011868857726015315881_">
|
||||
<polygon id="XMLID_00000047760733375327048070000017762681438431221901_" class="st2" points="2742,771.3 2740.7,772.1
|
||||
1721.7,183.8 1723,183 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000041974696609876830600000005670271776326177195_">
|
||||
<polygon id="XMLID_00000129189358748097425900000016230039239487626931_" class="st2" points="2912.6,672.8 2911.4,673.5
|
||||
1892.4,85.3 1893.7,84.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000041293895709094064820000009783370564313938334_">
|
||||
<polygon id="XMLID_00000015352334506883659860000008662127655563954606_" class="st2" points="20.6,186.2 -1174.8,876.4
|
||||
-1176.1,875.7 19.4,185.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000007390172772709378140000014137098145099763097_">
|
||||
<polygon id="XMLID_00000101103173169684591870000013226181548395502493_" class="st2" points="190.5,284.3 -1005,974.5
|
||||
-1006.3,973.7 189.2,283.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000000186738115847274800000004595450111546749358_">
|
||||
<polygon id="XMLID_00000014634371684113466930000014673643692297164446_" class="st2" points="360.3,382.3 -835.2,1072.5
|
||||
-836.5,1071.8 359,381.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000008830344121994999530000016753635616681531532_">
|
||||
<polygon id="XMLID_00000016767079653101325290000014185810922251035036_" class="st2" points="530.1,480.3 -665.4,1170.5
|
||||
-666.6,1169.8 528.8,479.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000102520461909151795810000015434115650182429095_">
|
||||
<polygon id="XMLID_00000021801600352416943000000015896325962502917295_" class="st2" points="699.9,578.4 -495.5,1268.6
|
||||
-496.8,1267.8 698.6,577.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000067200152001110196230000003606268878771070371_">
|
||||
<polygon id="XMLID_00000080912121959675076060000010999721409079993764_" class="st2" points="15.6,1168.8 14.3,1169.6
|
||||
-1004.6,581.3 -1003.3,580.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000041982285474608565810000004559185799639543716_">
|
||||
<polygon id="XMLID_00000047752160458784607960000018420580237055922821_" class="st2" points="186.3,1070.3 185,1071
|
||||
-833.9,482.7 -832.6,482 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000021092668367371603480000014302288429492100003_">
|
||||
<polygon id="XMLID_00000133522729132041306360000016426437187584250778_" class="st2" points="357,971.7 355.7,972.5
|
||||
-663.2,384.2 -662,383.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000043440687175549670490000000185411293111546267_">
|
||||
<polygon id="XMLID_00000054247774033148285290000002248920634348494738_" class="st2" points="527.7,873.2 526.4,873.9
|
||||
-492.6,285.7 -491.3,284.9 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000034077211944538950860000015606712309263985808_">
|
||||
<polygon id="XMLID_00000063617114352312488480000016033742238509047936_" class="st2" points="698.3,774.7 697,775.4
|
||||
-321.9,187.1 -320.6,186.4 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000139287038625357713070000000661456859636452481_">
|
||||
<polygon id="XMLID_00000177465485952367752830000000433349159663821728_" class="st2" points="869,676.1 867.7,676.9
|
||||
-151.2,88.6 -149.9,87.8 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000152983286059050966320000016367525973260780725_">
|
||||
<polygon id="XMLID_00000160186459663839767080000012127778829681724802_" class="st2" points="869.7,675.7 868.4,676.5
|
||||
-150.5,88.2 -149.3,87.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000021803673430177058290000009300669789135999394_">
|
||||
<polygon id="XMLID_00000166674682338414516090000002023737629610576294_" class="st2" points="1216,-504 20.6,186.2
|
||||
19.3,185.5 1214.7,-504.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000027584758907444302940000000439449324323913647_">
|
||||
<polygon id="XMLID_00000106848951270708658320000000374409828880877758_" class="st2" points="1385.8,-405.9 190.4,284.3
|
||||
189.1,283.6 1384.6,-406.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000129894934288089775370000001306545012910883507_">
|
||||
<polygon id="XMLID_00000059303132923395936600000017724211843501679495_" class="st2" points="1555.7,-307.9 360.2,382.3
|
||||
358.9,381.6 1554.4,-308.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000176725769730970743970000018414718406782887342_">
|
||||
<polygon id="XMLID_00000014628985006399707260000015468628637635334034_" class="st2" points="1725.5,-209.8 530,480.4
|
||||
528.7,479.6 1724.2,-210.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000151510541662397458580000007655244852968895647_">
|
||||
<polygon id="XMLID_00000007394365587086662230000008461292989746959762_" class="st2" points="1895.3,-111.8 699.9,578.4
|
||||
698.6,577.7 1894,-112.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000062194518888472429840000017147849831603331256_">
|
||||
<polygon id="XMLID_00000106859706457774314660000013220619198826666636_" class="st2" points="2065.1,-13.7 869.7,676.5
|
||||
868.4,675.7 2063.9,-14.5 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000007429036987148007550000010681519545412170402_">
|
||||
<polygon id="XMLID_00000046306630197373423780000015115640819116702855_" class="st2" points="1040.3,577.2 1039.1,577.9
|
||||
20.1,-10.3 21.4,-11.1 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000022538457593175977690000008424135092628186022_">
|
||||
<polygon id="XMLID_00000028321459259680269050000015502024227616169118_" class="st2" points="1211,478.7 1209.7,479.4
|
||||
190.8,-108.9 192.1,-109.6 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000098918655834541259140000001408141438622944175_">
|
||||
<polygon id="XMLID_00000114045012543386457050000008016354056212450701_" class="st2" points="1381.7,380.1 1380.4,380.9
|
||||
361.5,-207.4 362.8,-208.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000136405441145348369250000017012471294048381098_">
|
||||
<polygon id="XMLID_00000123438865971816913180000006211344053696890762_" class="st2" points="1552.4,281.6 1551.1,282.3
|
||||
532.1,-305.9 533.4,-306.7 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000036930566646481894160000008330066632914404759_">
|
||||
<polygon id="XMLID_00000011740484236623867440000009554288470579594940_" class="st2" points="1723,183 1721.7,183.8
|
||||
702.8,-404.5 704.1,-405.2 "/>
|
||||
</g>
|
||||
<g id="XMLID_00000098184613231558345480000013477082369138778284_">
|
||||
<polygon id="XMLID_00000031925202698778351660000001429369697827315606_" class="st2" points="1893.7,84.5 1892.4,85.3
|
||||
873.5,-503 874.8,-503.8 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="V1">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000127736852682445842370000002348014254331820450_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000054984103335254951850000000913394718092417707_">
|
||||
<use xlink:href="#SVGID_00000127736852682445842370000002348014254331820450_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000054984103335254951850000000913394718092417707_);fill:#FFBDB9;" points="0,513.6
|
||||
-79.8,561.2 0,610 79.9,561.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000026148469511049754200000009968401991571475348_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000079475587327847231050000002911551116668149183_">
|
||||
<use xlink:href="#SVGID_00000026148469511049754200000009968401991571475348_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000079475587327847231050000002911551116668149183_);fill:#A27F50;" points="1716,146
|
||||
1657.2,181.1 1716,217 1774.9,181.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000145753635600874933320000004897962307761384079_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000129904978439157718520000005299637536228623266_">
|
||||
<use xlink:href="#SVGID_00000145753635600874933320000004897962307761384079_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000129904978439157718520000005299637536228623266_);fill:#3145B7;" points="0,1069.6
|
||||
-132.8,1148.8 0,1230 133,1149.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000165931441860217597670000008050027574356636296_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000137835636617730584380000003367441586327331492_">
|
||||
<use xlink:href="#SVGID_00000165931441860217597670000008050027574356636296_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000137835636617730584380000003367441586327331492_);fill:#FFD300;" points="0,1025.3
|
||||
-132.8,1104.5 0,1185.7 133,1105.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000034065140043565596850000017478044862292536739_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000177450352250662692710000006424829503085921197_">
|
||||
<use xlink:href="#SVGID_00000034065140043565596850000017478044862292536739_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000177450352250662692710000006424829503085921197_);fill:#FF9600;" points="756,-23.4
|
||||
676.2,24.2 756,73 835.9,24.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000155147677355237900320000012556576578435659186_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000072279143137885720190000016131542453732360618_">
|
||||
<use xlink:href="#SVGID_00000155147677355237900320000012556576578435659186_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000072279143137885720190000016131542453732360618_);fill:#F3EAE4;" points="756,-50
|
||||
676.2,-2.4 756,46.4 835.9,-1.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000101082060867471068270000014364909690227397045_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000127738072831676665790000004087370255366363297_">
|
||||
<use xlink:href="#SVGID_00000101082060867471068270000014364909690227397045_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000127738072831676665790000004087370255366363297_);fill:#FF9600;" points="361,916.6
|
||||
275.1,967.9 361,1020.4 447,968.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000119107677403441221450000008812412828791479228_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000044145067228804199670000005771684367502909608_">
|
||||
<use xlink:href="#SVGID_00000119107677403441221450000008812412828791479228_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000044145067228804199670000005771684367502909608_);fill:#FFD300;" points="1045,146
|
||||
982.9,183 1045,221 1107.2,183.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000154422838857326783960000014893307211605333395_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000069362693926221279310000008339412765463041459_">
|
||||
<use xlink:href="#SVGID_00000154422838857326783960000014893307211605333395_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000069362693926221279310000008339412765463041459_);fill:#3145B7;" points="249,24
|
||||
186.9,61 249,99 311.2,61.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000082333957203797916110000018260977802411740587_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000093869962036583297480000005863197771722376098_">
|
||||
<use xlink:href="#SVGID_00000082333957203797916110000018260977802411740587_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000093869962036583297480000005863197771722376098_);fill:#3145B7;" points="700.4,513.2
|
||||
599.9,573.1 700.4,634.6 801,573.9 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000045619507921140421650000003729377017819897514_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000039826899951146924250000000289990911954531738_">
|
||||
<use xlink:href="#SVGID_00000045619507921140421650000003729377017819897514_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000039826899951146924250000000289990911954531738_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
402,407 528.8,479.6 358.5,578.5 528.5,676.5 186.5,874.1 311.4,946.2 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000000194086928070729720000000519840430203006593_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000168805357699523429570000007485248425140512397_">
|
||||
<use xlink:href="#SVGID_00000000194086928070729720000000519840430203006593_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000168805357699523429570000007485248425140512397_);fill:#A27F50;" points="351,316
|
||||
249.1,376.7 351,439 453,377.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000165943850828845075270000016825892426304043950_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000052812963253688462610000015184149813544607365_">
|
||||
<use xlink:href="#SVGID_00000165943850828845075270000016825892426304043950_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000052812963253688462610000015184149813544607365_);fill:#F3EAE4;" points="351,282
|
||||
249.1,342.7 351,405 453,343.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000048473689437072489640000006590337839646135194_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000051362265157955842450000015189917957128887190_">
|
||||
<use xlink:href="#SVGID_00000048473689437072489640000006590337839646135194_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000051362265157955842450000015189917957128887190_);">
|
||||
<polygon class="st17" points="1727.1,823.9 1156.2,1154 1549,1394 2120.3,1061 "/>
|
||||
<polygon class="st18" points="1664.6,787 1093.7,1117.1 1150.9,1151.6 1722.2,818.6 "/>
|
||||
<ellipse class="st17" cx="1143.4" cy="1121.1" rx="10.6" ry="6.9"/>
|
||||
<ellipse class="st17" cx="1166.5" cy="1108.8" rx="10.6" ry="6.9"/>
|
||||
<ellipse class="st17" cx="1191.7" cy="1097.5" rx="10.6" ry="6.9"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000118393621064128169980000017729977469728550811_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000013872575964963308350000007609819028209525673_">
|
||||
<use xlink:href="#SVGID_00000118393621064128169980000017729977469728550811_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000013872575964963308350000007609819028209525673_);fill:#F3EAE4;" cx="402.5" cy="406.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000124852063949419209040000015054686950021975466_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000137116810284659946330000010248236107917044124_">
|
||||
<use xlink:href="#SVGID_00000124852063949419209040000015054686950021975466_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000137116810284659946330000010248236107917044124_);fill:#F3EAE4;" cx="1690.5" cy="199.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000152259323569216362720000002840477086840399515_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000011721577418556256600000009798367043526060219_">
|
||||
<use xlink:href="#SVGID_00000152259323569216362720000002840477086840399515_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000011721577418556256600000009798367043526060219_);fill:#F3EAE4;" cx="1191.7" cy="1061.4" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000022562585366509584930000010091813104120547246_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000094616677291308378500000011001471672871354765_">
|
||||
<use xlink:href="#SVGID_00000022562585366509584930000010091813104120547246_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000094616677291308378500000011001471672871354765_);fill:#F3EAE4;" cx="1534.5" cy="863.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000096758967414071434260000006111871748037986962_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000028307089590291275020000001830403630949639861_">
|
||||
<use xlink:href="#SVGID_00000096758967414071434260000006111871748037986962_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000028307089590291275020000001830403630949639861_);fill:#F3EAE4;" cx="1362.5" cy="961.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000072961285232518210380000018244758777564582070_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000120532252740828006120000005421162930229796535_">
|
||||
<use xlink:href="#SVGID_00000072961285232518210380000018244758777564582070_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000120532252740828006120000005421162930229796535_);fill:#F3EAE4;" cx="748.5" cy="605.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000125574736855597190500000012683660085374787771_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000011718705093108660700000014716482287151188114_">
|
||||
<use xlink:href="#SVGID_00000125574736855597190500000012683660085374787771_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000011718705093108660700000014716482287151188114_);fill:#F3EAE4;" cx="1680.5" cy="795.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000053507786266854058100000003229449386748352189_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000002380940919774352270000006597272452379592887_">
|
||||
<use xlink:href="#SVGID_00000053507786266854058100000003229449386748352189_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000002380940919774352270000006597272452379592887_);fill:#F3EAE4;" cx="1076.5" cy="203.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000005243615577130758860000006088090072822634398_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000165219407360349789220000016135559495675424177_">
|
||||
<use xlink:href="#SVGID_00000005243615577130758860000006088090072822634398_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000165219407360349789220000016135559495675424177_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1076.2,203.4 1211.2,282.5 1041.5,380.5 1380.5,578.5 1210.5,676.5 1534.6,863.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000093900036644532195270000008885511590077827492_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000158712862332577233010000013536020692585303724_">
|
||||
<use xlink:href="#SVGID_00000093900036644532195270000008885511590077827492_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000158712862332577233010000013536020692585303724_);fill:#3145B7;" points="1315,1096
|
||||
1210.1,1154.7 1553,1355 1655,1293.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000143605751713329844920000013822395586009177769_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000042704168709325867040000004356789687594446978_">
|
||||
<use xlink:href="#SVGID_00000143605751713329844920000013822395586009177769_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000042704168709325867040000004356789687594446978_);fill:#3145B7;" points="1725,862
|
||||
1334.1,1083.7 1672,1281 2063,1058.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000150077470909687320590000000401425548870225310_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000092445074584587390290000004397237593822884993_">
|
||||
<use xlink:href="#SVGID_00000150077470909687320590000000401425548870225310_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000092445074584587390290000004397237593822884993_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
400.6,996.5 526.2,1070.1 867.3,872.9 1200,1065.6 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000183218555234574158940000014155854597877894822_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000045581142689473481140000001453531232810003623_">
|
||||
<use xlink:href="#SVGID_00000183218555234574158940000014155854597877894822_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000045581142689473481140000001453531232810003623_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1690.8,201.6 1380.1,380.3 1467,429 1846.8,649.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000142176680661118001700000000056292506240106629_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000020363588066720560260000006246216324370381193_">
|
||||
<use xlink:href="#SVGID_00000142176680661118001700000000056292506240106629_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000020363588066720560260000006246216324370381193_);fill:#3145B7;" points="1546,415
|
||||
1444.1,475.7 1546,538 1648,476.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000168810118848037961950000012505611063114676155_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000049210143493618968680000002229873306805486506_">
|
||||
<use xlink:href="#SVGID_00000168810118848037961950000012505611063114676155_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000049210143493618968680000002229873306805486506_);fill:#FFBDB9;" points="1546,381
|
||||
1444.1,441.7 1546,504 1648,442.5 "/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000165922301747348760930000012983865177890492308_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000004524134036829400490000014328108213026689722_">
|
||||
<use xlink:href="#SVGID_00000165922301747348760930000012983865177890492308_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<line style="clip-path:url(#SVGID_00000004524134036829400490000014328108213026689722_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" x1="1851.8" y1="697" x2="1680.7" y2="795.8"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000125563833770909976000000003279072340221467035_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000062161585541973031370000002108836801420466072_">
|
||||
<use xlink:href="#SVGID_00000125563833770909976000000003279072340221467035_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<line style="clip-path:url(#SVGID_00000062161585541973031370000002108836801420466072_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" x1="748.6" y1="605.5" x2="1362.7" y2="961.5"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_00000059286052358303095300000000391935342780460702_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000127045372486389353300000004096268284369660033_">
|
||||
<use xlink:href="#SVGID_00000059286052358303095300000000391935342780460702_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000127045372486389353300000004096268284369660033_);fill:#FF9600;" points="1877,628
|
||||
1797.2,675.6 1877,724.4 1956.9,676.2 "/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="V2" class="st37">
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000143614369986136362270000007560653516744853689_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000133499380238303515840000005905569892772177586_">
|
||||
<use xlink:href="#SVGID_00000143614369986136362270000007560653516744853689_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000133499380238303515840000005905569892772177586_);fill:#3145B7;" points="0,513.6
|
||||
-79.8,561.2 0,610 79.9,561.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000121255238383532626980000007297960717014315679_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000156583132613635255580000001608079459649643911_">
|
||||
<use xlink:href="#SVGID_00000121255238383532626980000007297960717014315679_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000156583132613635255580000001608079459649643911_);fill:#F3EAE4;" points="0,1069.6
|
||||
-132.8,1148.8 0,1230 133,1149.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000060023958902487786010000001645203670006047367_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000093870412984825956080000001082601028832750770_">
|
||||
<use xlink:href="#SVGID_00000060023958902487786010000001645203670006047367_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000093870412984825956080000001082601028832750770_);fill:#FFD300;" points="0,1025.3
|
||||
-132.8,1104.5 0,1185.7 133,1105.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000090255600037663639700000010647737479641217948_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000127736745835869221250000016463224839949700768_">
|
||||
<use xlink:href="#SVGID_00000090255600037663639700000010647737479641217948_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000127736745835869221250000016463224839949700768_);fill:#F3EAE4;" points="756,-23.4
|
||||
676.2,24.2 756,73 835.9,24.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000039127304168117280280000012078189384173010850_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000041988513719087917250000004691727834069373077_">
|
||||
<use xlink:href="#SVGID_00000039127304168117280280000012078189384173010850_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000041988513719087917250000004691727834069373077_);fill:#FF9600;" points="756,-50
|
||||
676.2,-2.4 756,46.4 835.9,-1.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000023995343828850366440000016916099664025849239_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000082348548081903710580000000021353711819211697_">
|
||||
<use xlink:href="#SVGID_00000023995343828850366440000016916099664025849239_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000082348548081903710580000000021353711819211697_);fill:#FFBDB9;" points="697,551.8
|
||||
650.1,579.8 697,608.5 744,580.2 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000115478454368905652440000012939993213725062806_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000141424335908505696050000017955398454523774649_">
|
||||
<use xlink:href="#SVGID_00000115478454368905652440000012939993213725062806_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000141424335908505696050000017955398454523774649_);fill:#FFD300;" points="1213,47
|
||||
1150.9,84 1213,122 1275.2,84.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000055668343319898750820000001804962040182697604_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000126283024313299661180000002830917718937153673_">
|
||||
<use xlink:href="#SVGID_00000055668343319898750820000001804962040182697604_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000126283024313299661180000002830917718937153673_);fill:#FFBDB9;" points="249,24
|
||||
186.9,61 249,99 311.2,61.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000014630341636951485590000005905790639244285594_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000077305139023293154890000015804768298382291086_">
|
||||
<use xlink:href="#SVGID_00000014630341636951485590000005905790639244285594_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000077305139023293154890000015804768298382291086_);fill:#A27F50;" points="351,316
|
||||
249.1,376.7 351,439 453,377.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000097459112887082222460000004635324953426236859_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000099630129309124272560000005424888522754882189_">
|
||||
<use xlink:href="#SVGID_00000097459112887082222460000004635324953426236859_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000099630129309124272560000005424888522754882189_);fill:#F3EAE4;" points="351,282
|
||||
249.1,342.7 351,405 453,343.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000009592065457736750930000002568202835339755965_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000074420048083180720850000005660015341651636618_">
|
||||
<use xlink:href="#SVGID_00000009592065457736750930000002568202835339755965_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000074420048083180720850000005660015341651636618_);">
|
||||
<polygon class="st17" points="1776.8,806 1119.4,1186.1 1571.7,1462.5 2229.6,1079.1 "/>
|
||||
<polygon class="st18" points="1704.8,763.5 1047.4,1143.6 1113.3,1183.3 1771.2,799.9 "/>
|
||||
<ellipse class="st17" cx="1104.6" cy="1148.3" rx="12.3" ry="7.9"/>
|
||||
<ellipse class="st17" cx="1131.3" cy="1134.1" rx="12.3" ry="7.9"/>
|
||||
<ellipse class="st17" cx="1160.2" cy="1121" rx="12.3" ry="7.9"/>
|
||||
</g>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000065782803800424876200000005747599800107267464_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000011747768830144233880000006562306095018839473_">
|
||||
<use xlink:href="#SVGID_00000065782803800424876200000005747599800107267464_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000011747768830144233880000006562306095018839473_);fill:#F3EAE4;" cx="402.5" cy="406.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000169552306152978148960000000544137394431524748_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000013157062394338683150000013515564009310648999_">
|
||||
<use xlink:href="#SVGID_00000169552306152978148960000000544137394431524748_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000013157062394338683150000013515564009310648999_);fill:#F3EAE4;" cx="1362.5" cy="961.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000169550641910798302390000018079750890223912613_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000013883916898646908530000013926501663757172128_">
|
||||
<use xlink:href="#SVGID_00000169550641910798302390000018079750890223912613_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000013883916898646908530000013926501663757172128_);fill:#F3EAE4;" cx="1247.5" cy="104.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000129176931204107253050000015002324711644247170_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000029008757185472032850000013986890390064364204_">
|
||||
<use xlink:href="#SVGID_00000129176931204107253050000015002324711644247170_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000029008757185472032850000013986890390064364204_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1248.5,105.5 1382.5,183.5 1552.5,85.5 1721.5,183.5 1381.5,380.5 1549.5,477.5 1721.5,576.5 1301.5,818.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000154398845280440012690000012695258342323463351_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000160163617090155004710000001635626138734186666_">
|
||||
<use xlink:href="#SVGID_00000154398845280440012690000012695258342323463351_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000160163617090155004710000001635626138734186666_);fill:#3145B7;" points="
|
||||
1302.2,1119.3 1181.4,1187 1576.3,1417.6 1693.7,1346.8 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000088097803390984933370000010578364190482803123_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000109738877249508613360000015102492162918906520_">
|
||||
<use xlink:href="#SVGID_00000088097803390984933370000010578364190482803123_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000109738877249508613360000015102492162918906520_);fill:#3145B7;" points="1774.4,849.9
|
||||
1324.2,1105.2 1713.3,1332.4 2163.6,1076.1 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000016066467601354244220000002018156486310614195_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000150798237870894630030000002779999083364707242_">
|
||||
<use xlink:href="#SVGID_00000016066467601354244220000002018156486310614195_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000150798237870894630030000002779999083364707242_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1112.5,927.5 865.5,1069.5 356.9,773.5 187.5,677.5 358.5,578.5 529.5,479.5 402,407 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000082330699241480134340000004261941559118969516_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000152258910213155202580000000896616385851496102_">
|
||||
<use xlink:href="#SVGID_00000082330699241480134340000004261941559118969516_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000152258910213155202580000000896616385851496102_);fill:#F3EAE4;" points="1546,415
|
||||
1444.1,475.7 1546,538 1648,476.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000017502376985705843720000016794955214344614288_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000014593979418167035950000016708929353612887732_">
|
||||
<use xlink:href="#SVGID_00000017502376985705843720000016794955214344614288_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000014593979418167035950000016708929353612887732_);fill:#3145B7;" points="1049,328
|
||||
947.1,388.7 1049,451 1151,389.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000161618323926346785290000009029845740765637550_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000101088622576841138830000008061094839055885965_">
|
||||
<use xlink:href="#SVGID_00000161618323926346785290000009029845740765637550_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000101088622576841138830000008061094839055885965_);fill:#FFBDB9;" points="1546,381
|
||||
1444.1,441.7 1546,504 1648,442.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000093861940671694908680000016382552859857510793_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000137094997539696298690000006818698997336822665_">
|
||||
<use xlink:href="#SVGID_00000093861940671694908680000016382552859857510793_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000137094997539696298690000006818698997336822665_);fill:#FF9600;" points="1877,628
|
||||
1797.2,675.6 1877,724.4 1956.9,676.2 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000004504296126374307120000008264859571140435641_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000183249326757029932450000006511838227619820166_">
|
||||
<use xlink:href="#SVGID_00000004504296126374307120000008264859571140435641_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000183249326757029932450000006511838227619820166_);fill:#FF9600;" points="1716,146
|
||||
1657.2,181.1 1716,217 1774.9,181.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000160900346452575354020000007118520698774230666_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000101809427109148069640000003478486000252273540_">
|
||||
<use xlink:href="#SVGID_00000160900346452575354020000007118520698774230666_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<line style="clip-path:url(#SVGID_00000101809427109148069640000003478486000252273540_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" x1="1233.5" y1="886.5" x2="1362.5" y2="961.6"/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000062184612866266282820000012222770164839208331_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000176006039373874794540000003432218681784018326_">
|
||||
<use xlink:href="#SVGID_00000062184612866266282820000012222770164839208331_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000176006039373874794540000003432218681784018326_);fill:#FFFFFF;" points="1273.6,803.3
|
||||
1083.7,912.4 1140.9,946.9 1331,835 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000111904075869562228390000000029301977090326158_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000051354684401989131050000010437733296546684332_">
|
||||
<use xlink:href="#SVGID_00000111904075869562228390000000029301977090326158_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000051354684401989131050000010437733296546684332_);">
|
||||
<g>
|
||||
<g class="st65">
|
||||
<g>
|
||||
<g>
|
||||
<defs>
|
||||
<polygon id="SVGID_00000095325708202275608810000001183464575504323259_" points="1136.6,923.1 1115.4,911.9 1281.2,823.7
|
||||
1302.4,834.9 "/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000063595377401201767860000011444569133170569648_">
|
||||
<use xlink:href="#SVGID_00000095325708202275608810000001183464575504323259_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000063595377401201767860000011444569133170569648_);">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path class="st67" d="M1250.4,858c-3,1.6-5.4,0.8-8.8-0.9c-3.4-1.8-5-3-1.9-4.7h0.1c3-1.6,5.4-0.8,8.8,0.9
|
||||
S1253.5,856.3,1250.4,858C1250.5,857.9,1250.5,857.9,1250.4,858 M1236.9,850.7c-0.1,0-0.1,0.1-0.2,0.1
|
||||
c-5.7,3.1-3.6,5.7,1.3,8.2s9.7,3.6,15.3,0.6c0.1,0,0.1-0.1,0.2-0.1c5.7-3.1,3.6-5.7-1.3-8.2
|
||||
C1247.3,848.7,1242.5,847.7,1236.9,850.7"/>
|
||||
<path class="st67" d="M1133.3,907.5l-2.6,1.4c-0.3,0.1-0.3,0.4,0,0.5l12,6.2c-0.5,0.9-1.4,1.8-2.7,2.5c0,0,0,0-0.1,0
|
||||
h-0.1c-1.7,0.9-3.2,0.9-4.8,0.1l-10.5-5.5c-0.3-0.1-0.7-0.1-1,0l-2.6,1.4c-0.3,0.1-0.3,0.4,0,0.5l10.9,5.6
|
||||
c3,1.6,6.5,1.8,10.5-0.3c0.1,0,0.1-0.1,0.2-0.1c1.8-1,3.1-2.3,3.5-3.7l1.5,0.3l0,0c0.2,0,0.5,0,0.7-0.1l1.3-0.7
|
||||
c0.3-0.1,0.3-0.4,0-0.5l-15.1-7.8C1134,907.3,1133.6,907.3,1133.3,907.5"/>
|
||||
<path class="st67" d="M1155.9,894.8C1155.9,894.8,1155.8,894.8,1155.9,894.8c-1.9,1.1-3.2,2.4-3.6,3.7
|
||||
c-1.6-0.1-3.5,0.2-5.5,1.3c0,0-0.1,0-0.1,0.1c-1.7,1-2.8,2.2-3.2,3.5l-1.5-0.3c-0.2,0-0.5,0-0.6,0.1l0,0l-1.3,0.7
|
||||
c-0.3,0.1-0.3,0.4,0,0.5l15.1,7.8c0.3,0.1,0.7,0.1,0.9,0l0,0l2.6-1.4c0.3-0.1,0.3-0.4,0-0.5l-11.9-6.2
|
||||
c0.4-0.9,1.2-1.7,2.4-2.3h0.1c1.4-0.7,2.8-0.9,4.3-0.1l10.9,5.6c0.3,0.1,0.7,0.1,1,0l2.6-1.4c0.3-0.1,0.3-0.4,0-0.5
|
||||
l-12-6.2c0.4-0.9,1.2-1.7,2.4-2.3c0,0,0,0,0.1,0c1.4-0.7,2.8-0.9,4.3-0.1l10.9,5.6c0.3,0.1,0.7,0.1,0.9,0l0,0l2.6-1.4
|
||||
c0.3-0.1,0.3-0.4,0-0.5l-10.9-5.6C1163.1,893.1,1159.6,892.8,1155.9,894.8"/>
|
||||
<path class="st67" d="M1187.2,892.3c-1.2,0.6-2.7,1.1-4.3,1.3l-8.9-4.6c0.4-0.9,1.3-1.7,2.5-2.4c0,0,0,0,0.1,0
|
||||
c3.1-1.7,6-0.7,8.9,0.8s4.9,3,1.7,4.7l0,0C1187.3,892.3,1187.3,892.3,1187.2,892.3 M1165.6,885.2l-2.6,1.4
|
||||
c-0.3,0.1-0.3,0.4,0,0.5l19.6,10.1c0.3,0.1,0.7,0.1,0.9,0l0,0l1.3-0.7c0.2-0.1,0.2-0.2,0.2-0.4l-0.6-0.8
|
||||
c2.5-0.2,4.8-0.9,6.6-1.8c0.1,0,0.2-0.1,0.3-0.1c4.7-2.5,3.2-5.1-2-7.8s-10.1-3.4-14.7-0.9c0,0-0.1,0-0.1,0.1
|
||||
c-1.5,0.8-2.6,1.9-3,3l-4.9-2.5C1166.3,885,1165.8,885,1165.6,885.2"/>
|
||||
<path class="st67" d="M1193,874.6C1193,874.6,1192.9,874.6,1193,874.6c-0.1,0.1-0.1,0.1-0.2,0.1c-1.8,1-3,2.2-3.3,3.6
|
||||
l-1.5-0.3c-0.2,0-0.5,0-0.7,0.1l-1.3,0.7c-0.3,0.1-0.3,0.4,0,0.5l15.1,7.8c0.3,0.1,0.7,0.1,0.9,0l0,0l2.6-1.4
|
||||
c0.3-0.1,0.3-0.4,0-0.5l-11.9-6.2c0.5-1,1.5-1.9,2.9-2.6c0.1,0,0.2-0.1,0.2-0.1c0.1,0,0.1-0.1,0.2-0.1
|
||||
c0.3-0.2,0.7-0.4,1.1-0.5l0,0l0,0c0.3-0.1,0.3-0.4,0-0.5l-1.9-1c-0.3-0.1-0.8-0.2-1.1-0.1
|
||||
C1193.8,874.2,1193.4,874.4,1193,874.6"/>
|
||||
<path class="st67" d="M1217,876.3c-1.9,1-3.6,0.7-4.8,0.1c-1.7-0.9-1.3-1.7,0.1-2.7l3-2l4.2,2.1
|
||||
C1219.1,874.7,1218.3,875.6,1217,876.3C1217,876.2,1217,876.2,1217,876.3 M1203.9,868.6c-0.1,0-0.1,0.1-0.2,0.1
|
||||
c-1.7,0.9-3.1,2-4.1,3.1c-0.1,0.1-0.1,0.3,0.1,0.4l2.1,1.1c0.3,0.1,0.7,0.1,0.9,0l0,0l0.1-0.1c0.9-1,2.1-1.9,3.6-2.8
|
||||
c0.1,0,0.1-0.1,0.2-0.1c2.3-1.2,3.6-1.3,5.2-0.4l0.8,0.4l-3.3,2.1c-3.3,2.1-4.1,4.1-0.6,5.9c2.6,1.3,6.4,1.9,10.5-0.3
|
||||
c0,0,0.1,0,0.1-0.1c1.7-1,2.9-2.2,3.1-3.5l1.5,0.3c0.2,0,0.5,0,0.6-0.1l0,0l1.3-0.7c0.3-0.1,0.3-0.4,0-0.5l-10.2-5.3
|
||||
C1212.5,866.4,1209,865.9,1203.9,868.6"/>
|
||||
<path class="st67" d="M1222.3,858.6c-0.1,0.1-0.3,0.2-0.4,0.2c-5.7,3.1-4,5.8,1,8.4c5,2.6,10.1,3.4,15.7,0.4
|
||||
c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1-0.1c1.4-0.7,2.5-1.6,3.3-2.5c0.1-0.1,0-0.3-0.2-0.4l-2.1-1.1c-0.3-0.1-0.7-0.1-1,0
|
||||
l-0.1,0.1l0,0c-0.8,0.8-1.8,1.5-3,2.2c0,0,0,0-0.1,0h-0.1c-3.1,1.6-6.1,1-9.2-0.6s-4.3-3.2-1.2-4.9
|
||||
c0.1-0.1,0.2-0.1,0.3-0.2c1.1-0.6,2.4-1.1,3.8-1.5l0.2-0.1c0.3-0.1,0.3-0.4,0-0.5l-2.1-1.1c-0.2-0.1-0.5-0.1-0.7-0.1
|
||||
C1225.1,857.4,1223.6,857.9,1222.3,858.6"/>
|
||||
<path class="st67" d="M1263.4,833.5l-3.2,1.7l-0.9,5.5l2.8,0.2c0.1,0,0.3,0,0.5,0s0.4-0.1,0.6-0.1c0.1,0,0.2-0.1,0.3-0.1
|
||||
c0.1,0,0.2-0.1,0.3-0.2c0.1-0.1,0.2-0.3,0.3-0.4l0.3-2c0.2,0.1,0.4,0.3,0.7,0.4c0.2,0.1,0.5,0.2,0.7,0.4l9.1,4.7
|
||||
l-3.5,1.9l2.8,1.4l10.3-5.6l-2.8-1.4l-3,1.6L1263.4,833.5"/>
|
||||
<path class="st67" d="M1275,827C1275,827,1274.9,827,1275,827c-0.9,0.5-1.6,1-2.1,1.5s-0.8,1-0.9,1.6
|
||||
c-0.1,0.5,0,1.1,0.3,1.6c0.3,0.6,0.8,1.1,1.6,1.6l2.4-0.9c0.2-0.1,0.4-0.2,0.5-0.2c0.3-0.2,0.5-0.3,0.6-0.5
|
||||
s0.1-0.5-0.2-0.8c-0.3-0.3-0.4-0.7-0.3-1c0.1-0.4,0.4-0.7,1-1c0,0,0,0,0.1,0c0.7-0.4,1.4-0.5,2.1-0.5s1.4,0.2,2.2,0.6
|
||||
c0.4,0.2,0.8,0.5,1.1,0.7c0.3,0.3,0.5,0.6,0.7,0.9c0.2,0.3,0.3,0.7,0.4,1.1c0.1,0.4,0.1,0.8,0.1,1.3l0.1,5.5
|
||||
c0,0.2,0.1,0.5,0.2,0.7c0.2,0.2,0.4,0.4,0.6,0.5l1.2,0.6l12.6-6.9l-2.2-1.2c-0.4-0.2-0.8-0.3-1.3-0.3s-0.9,0.1-1.3,0.3
|
||||
l0,0l-3.4,1.8c-0.4,0.2-0.8,0.5-1.1,0.7c-0.4,0.3-0.7,0.6-1,0.9l-0.1-3.8c0-0.5,0-1-0.1-1.5s-0.2-0.9-0.4-1.4
|
||||
c-0.2-0.4-0.5-0.9-0.8-1.2c-0.4-0.4-0.9-0.8-1.6-1.1c-0.8-0.4-1.6-0.7-2.5-0.9s-1.8-0.3-2.8-0.2c-1,0-1.9,0.2-2.9,0.4
|
||||
C1276.7,826.2,1275.8,826.6,1275,827"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000055674499937063148610000004306812927114920883_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000004518033045209089300000016218411321581577390_">
|
||||
<use xlink:href="#SVGID_00000055674499937063148610000004306812927114920883_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<polyline style="clip-path:url(#SVGID_00000004518033045209089300000016218411321581577390_);fill:none;stroke:#F3EAE4;stroke-miterlimit:10;" points="
|
||||
1103.5,416.5 1210.5,478.5 868.5,675.5 1180.8,856.6 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000026123715033495807140000003180914406214489771_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000083798441028463063870000003796223072503923082_">
|
||||
<use xlink:href="#SVGID_00000026123715033495807140000003180914406214489771_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<polygon style="clip-path:url(#SVGID_00000083798441028463063870000003796223072503923082_);fill:#FF9600;" points="526,819.6
|
||||
440.1,870.9 526,923.4 612,871.5 "/>
|
||||
</g>
|
||||
<g class="st38">
|
||||
<defs>
|
||||
<rect id="SVGID_00000111883979398437530060000001831383631585137839_" width="1920" height="1164"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000098222490173758375790000012838647409064945039_">
|
||||
<use xlink:href="#SVGID_00000111883979398437530060000001831383631585137839_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<ellipse style="clip-path:url(#SVGID_00000098222490173758375790000012838647409064945039_);fill:#F3EAE4;" cx="1104.5" cy="416.6" rx="12.5" ry="8.1"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 56 KiB |
1
src/Umbraco.Web.UI.Login/public/logo_dark.svg
Symbolic link
@@ -0,0 +1 @@
|
||||
../../Umbraco.Web.UI.Client/src/assets/img/application/umbraco_logo_blue.svg
|
||||
1
src/Umbraco.Web.UI.Login/public/logo_light.svg
Symbolic link
@@ -0,0 +1 @@
|
||||
../../Umbraco.Web.UI.Client/src/assets/img/application/umbraco_logo_white.svg
|
||||
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 316"><path d="M.2 157.8C.3 70.6 71.1-.1 158.3.1S316.2 71 316.1 158.2s-70.8 157.7-157.9 157.7C70.8 315.9.1 245.1.2 157.8zm154.7 54.1c-12.3.4-24.5-.7-36.5-3.3-8.8-1.8-16.3-7.8-19.9-16-3.6-8.2-5.3-20.9-5.2-38.1.1-9 .6-17.9 1.7-26.8 1-8.7 2.1-15.8 3.1-21.5l1.1-5.6v-.5c0-1.6-1.1-2.9-2.6-3.2l-20.4-3.2h-.4c-1.5 0-2.8 1-3.1 2.5-.3 1.3-.6 2.3-1.2 5.4-1.2 6-2.2 11.8-3.4 20.4-1.3 9.3-2 18.6-2.3 27.9-.4 6.5-.4 13 0 19.6.5 17.3 3.4 31.1 8.9 41.4 5.5 10.3 14.7 17.8 27.7 22.3s31.2 6.8 54.4 6.7h2.9c23.3.1 41.4-2.1 54.4-6.7 13-4.5 22.2-12 27.7-22.3s8.4-24.1 8.9-41.4c.4-6.5.4-13 0-19.6-.3-9.3-1-18.7-2.3-27.9-1.2-8.4-2.3-14.3-3.4-20.4-.6-3.1-.8-4.1-1.2-5.4-.3-1.4-1.6-2.5-3.1-2.5h-.5l-20.4 3.2c-1.6.3-2.7 1.6-2.7 3.2v.5l1.1 5.6c1 5.6 2.1 12.8 3.1 21.5 1 8.9 1.6 17.9 1.7 26.8.2 17.1-1.6 29.8-5.2 38.1-3.6 8.2-11 14.2-19.8 16.1-12 2.5-24.2 3.6-36.5 3.3l-6.6-.1zm932.3-43.9c0-30.4 8.6-51.7 43.8-51.7s43.8 21.3 43.8 51.7-8.6 51.7-43.8 51.7-43.8-21.3-43.8-51.7zm65.3 0c0-21.1-2.7-33.1-21.5-33.1s-21.5 12-21.5 33.1 2.8 33.1 21.5 33.1c18.8 0 21.5-12 21.5-33.1zm-672.1 47.8c.5.9 1.5 1.5 2.5 1.4h8.2c1.6 0 2.9-1.3 2.9-2.9v-92.7c0-1.6-1.3-2.9-2.9-2.9h-16.3c-1.6 0-2.9 1.3-2.9 2.9v73.6c-7 3.9-14.9 5.9-22.8 5.8-10.4 0-15.6-4.5-15.6-14.6v-64.8c0-1.6-1.3-2.9-2.9-2.9h-16.4c-1.6 0-2.9 1.3-2.9 2.9v66.7c0 18.9 8.9 31.3 33.9 31.3 11.4-.1 22.6-3.7 32-10.2l2.9 6.5.3-.1zm184.1-68.1c0-18.7-9.3-31.4-32.6-31.4-11.3 0-22.3 3.4-31.6 9.8-4.1-6.1-12-9.8-25.3-9.8-10.7.2-21.1 3.8-29.7 10.2l-2.9-6.5c-.5-.9-1.5-1.5-2.5-1.4h-8.3c-1.6 0-2.9 1.3-2.9 2.9v92.8c0 1.6 1.3 2.9 2.9 2.9h16.3c1.6 0 2.9-1.3 2.9-2.9v-73.5c6.2-3.8 13.4-5.8 20.7-5.8 8.9 0 14 3.3 14 12.6v66.7c0 1.6 1.3 2.9 2.9 2.9h16.3c1.6 0 2.9-1.3 2.9-2.9v-73.6c6.2-3.9 13.4-5.9 20.7-5.8 8.6 0 14 3.3 14 12.6v66.7c0 1.6 1.3 2.9 2.9 2.9h16.3c1.6 0 2.9-1.3 2.9-2.9l.1-66.5zm50.4 61.7c9.3 6.9 20.5 10.5 32 10.2 28.8 0 39.4-19.3 39.4-51.7s-10.7-51.7-39.4-51.7c-9.4 0-18.5 2.7-26.4 7.7V94.2c0-1.6-1.2-2.9-2.8-3h-16.6c-1.6 0-2.9 1.3-2.9 2.9v120.3c0 1.6 1.3 2.9 2.9 2.9h8.2c1 0 2-.5 2.5-1.4l3.1-6.5zm26.8-8.5c-7.5 0-14.8-2-21.3-5.8v-54.4c6.5-3.8 13.8-5.8 21.3-5.8 19.3 0 22.3 14.8 22.3 32.9s-2.8 33.1-22.3 33.1zM868 135.7c-2.5-.3-5.1-.5-7.7-.5-8.8-.4-17.5 1.7-25.3 5.9v73.2c0 1.6-1.3 2.9-2.9 2.9h-16.3c-1.6 0-2.9-1.3-2.9-2.9v-92.7c0-1.6 1.3-2.9 2.9-2.9h8.2c1 0 2 .5 2.5 1.4l2.9 6.5c8.9-6.8 19.9-10.4 31.2-10.2 2.6 0 5.2.2 7.7.6 1.4 0 2.7 2.4 2.7 4v11.8c0 1.6-1.3 2.9-2.9 2.9h-.2m56.7 36.1c-9.8 1.2-15.6 4.9-15.6 15.2 0 7.5 3.3 14.6 15.2 14.6 7.5.1 14.9-2.2 21.1-6.5v-25.5l-20.7 2.2zm26.1 37.6c-8.5 6.7-19 10.3-29.8 10.2-25.5 0-33.9-15.8-33.9-31.6 0-21.3 13.8-30.4 36.1-32.1l22.1-1.8v-4.9c0-10.1-4.7-14-19.3-14-9.2 0-18.3 1.5-26.9 4.5h-.9c-1.6 0-2.9-1.3-2.9-2.9v-13.1c0-1.2.7-2.4 1.9-2.8 9.8-3.3 20.1-5 30.5-4.9 32.3 0 39.8 14.2 39.8 35.1V214c0 1.6-1.3 2.9-2.9 2.9h-8.2c-1 0-2-.5-2.5-1.4l-3.1-6.1zM1063 197h.9c1.6 0 2.9 1.3 2.9 2.9V213c0 1.2-.7 2.3-1.8 2.7-8.1 2.9-16.7 4.3-25.4 4.1-34.9 0-45.7-20.9-45.7-51.7s10.7-51.7 45.7-51.7c8.6-.2 17.1 1.1 25.2 4 1.1.4 1.9 1.5 1.8 2.7v13.1c0 1.6-1.3 2.9-2.9 2.9h-.9c-7.1-2.2-14.6-3.3-22-3.1-19.1 0-24.7 13.1-24.7 32.2s5.5 32.1 24.7 32.1c7.5.1 14.9-1 22-3.3" fill="#fff"/></svg>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 315.89 315.89"><path fill="#fff" d="M0 157.74a157.95 157.95 0 11158 158.15A157.95 157.95 0 010 157.74zm154.74 54.09a155.41 155.41 0 01-36.5-3.29 27.92 27.92 0 01-19.94-16q-5.35-12.34-5.21-38.1a243 243 0 011.69-26.84q1.55-13 3.09-21.46l1.07-5.59a2 2 0 000-.49 3.2 3.2 0 00-2.65-3.17l-20.37-3.22h-.44a3.19 3.19 0 00-3.11 2.48c-.35 1.31-.56 2.27-1.17 5.38-1.16 6-2.24 11.85-3.43 20.38a264.17 264.17 0 00-2.3 27.94 145.24 145.24 0 000 19.57q.72 25.94 8.9 41.42t27.72 22.3q19.53 6.81 54.43 6.66h2.91q34.94.15 54.41-6.66t27.71-22.3q8.17-15.53 8.91-41.42a145.24 145.24 0 000-19.57 266.84 266.84 0 00-2.3-27.94c-1.2-8.44-2.27-14.26-3.44-20.38-.61-3.11-.81-4.07-1.16-5.38a3.21 3.21 0 00-3.12-2.48h-.52l-20.38 3.18a3.2 3.2 0 00-2.68 3.17 4 4 0 000 .49l1.08 5.59q1.55 8.48 3.12 21.46a245.68 245.68 0 011.65 26.84q.27 25.69-5.21 38.07a27.9 27.9 0 01-19.76 16.07 155.19 155.19 0 01-36.48 3.29z"/></svg>
|
||||
|
Before Width: | Height: | Size: 942 B |
@@ -1,10 +1,6 @@
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
#umb-login-form umb-login-input {
|
||||
width: 100%;
|
||||
height: 38px;
|
||||
height: var(--input-height);
|
||||
box-sizing: border-box;
|
||||
display: block;
|
||||
border: 1px solid var(--uui-color-border);
|
||||
@@ -12,23 +8,29 @@ body {
|
||||
outline: none;
|
||||
background-color: var(--uui-color-surface);
|
||||
}
|
||||
|
||||
#umb-login-form umb-login-input input {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
background: none;
|
||||
outline: none;
|
||||
padding: var(--uui-size-1, 3px) var(--uui-size-space-3, 9px);
|
||||
background: none;
|
||||
padding: var(--uui-size-1, 3px) var(--uui-size-space-4, 9px);
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
#umb-login-form uui-form-layout-item {
|
||||
margin-top: var(--uui-size-space-4);
|
||||
margin-bottom: var(--uui-size-space-4);
|
||||
}
|
||||
|
||||
#umb-login-form umb-login-input:focus-within {
|
||||
border-color: var(--uui-input-border-color-focus, var(--uui-color-border-emphasis, #a1a1a1));
|
||||
outline: calc(2px * var(--uui-show-focus-outline, 1)) solid var(--uui-color-focus);
|
||||
}
|
||||
|
||||
#umb-login-form umb-login-input:hover:not(:focus-within) {
|
||||
border-color: var(--uui-input-border-color-hover, var(--uui-color-border-standalone, #c2c2c2));
|
||||
}
|
||||
|
||||
@@ -7,11 +7,19 @@ import { umbAuthContext } from './context/auth.context.js';
|
||||
import { umbLocalizationContext } from './external/localization/localization-context.js';
|
||||
import { UmbLocalizeElement } from './external/localization/localize.element.js';
|
||||
import type { UmbLoginInputElement } from './components/login-input.element.js';
|
||||
import { InputType, UUIFormLayoutItemElement, UUILabelElement } from '@umbraco-ui/uui';
|
||||
import type { InputType, UUIFormLayoutItemElement, UUILabelElement } from '@umbraco-ui/uui';
|
||||
|
||||
import authStyles from './auth-styles.css?inline';
|
||||
|
||||
const createInput = (opts: {id: string, type: InputType, name: string, autocomplete: AutoFill, requiredMessage: string, label: string, inputmode: string}) => {
|
||||
const createInput = (opts: {
|
||||
id: string;
|
||||
type: InputType;
|
||||
name: string;
|
||||
autocomplete: AutoFill;
|
||||
requiredMessage: string;
|
||||
label: string;
|
||||
inputmode: string;
|
||||
}) => {
|
||||
const input = document.createElement('umb-login-input');
|
||||
input.type = opts.type;
|
||||
input.name = opts.name;
|
||||
@@ -26,7 +34,7 @@ const createInput = (opts: {id: string, type: InputType, name: string, autocompl
|
||||
return input;
|
||||
};
|
||||
|
||||
const createLabel = (opts: {forId: string, localizeAlias: string}) => {
|
||||
const createLabel = (opts: { forId: string; localizeAlias: string }) => {
|
||||
const label = document.createElement('uui-label');
|
||||
const umbLocalize = document.createElement('umb-localize') as UmbLocalizeElement;
|
||||
umbLocalize.key = opts.localizeAlias;
|
||||
@@ -65,27 +73,30 @@ export default class UmbAuthElement extends LitElement {
|
||||
*
|
||||
* @attr disable-local-login
|
||||
*/
|
||||
@property({ type: Boolean, attribute: 'disable-local-login' })
|
||||
@property({type: Boolean, attribute: 'disable-local-login'})
|
||||
set disableLocalLogin(value: boolean) {
|
||||
umbAuthContext.disableLocalLogin = value;
|
||||
}
|
||||
|
||||
@property({ attribute: 'background-image' })
|
||||
@property({attribute: 'background-image'})
|
||||
backgroundImage?: string;
|
||||
|
||||
@property({ attribute: 'logo-image' })
|
||||
@property({attribute: 'logo-image'})
|
||||
logoImage?: string;
|
||||
|
||||
@property({ type: Boolean, attribute: 'username-is-email' })
|
||||
@property({attribute: 'logo-image-alternative'})
|
||||
logoImageAlternative?: string;
|
||||
|
||||
@property({type: Boolean, attribute: 'username-is-email'})
|
||||
usernameIsEmail = false;
|
||||
|
||||
@property({ type: Boolean, attribute: 'allow-password-reset' })
|
||||
@property({type: Boolean, attribute: 'allow-password-reset'})
|
||||
allowPasswordReset = false;
|
||||
|
||||
@property({ type: Boolean, attribute: 'allow-user-invite' })
|
||||
@property({type: Boolean, attribute: 'allow-user-invite'})
|
||||
allowUserInvite = false;
|
||||
|
||||
@property({ type: String, attribute: 'return-url' })
|
||||
@property({attribute: 'return-url'})
|
||||
set returnPath(value: string) {
|
||||
umbAuthContext.returnPath = value;
|
||||
}
|
||||
@@ -140,10 +151,9 @@ export default class UmbAuthElement extends LitElement {
|
||||
* @private
|
||||
*/
|
||||
async #initializeForm() {
|
||||
const labelUsername =
|
||||
this.usernameIsEmail
|
||||
? await umbLocalizationContext.localize('general_username', undefined, 'Username')
|
||||
: await umbLocalizationContext.localize('general_email', undefined, 'Email');
|
||||
const labelUsername = this.usernameIsEmail
|
||||
? await umbLocalizationContext.localize('general_email', undefined, 'Email')
|
||||
: await umbLocalizationContext.localize('general_username', undefined, 'Username');
|
||||
const labelPassword = await umbLocalizationContext.localize('general_password', undefined, 'Password');
|
||||
const requiredMessage = await umbLocalizationContext.localize('general_required', undefined, 'Required');
|
||||
|
||||
@@ -154,7 +164,7 @@ export default class UmbAuthElement extends LitElement {
|
||||
autocomplete: 'username',
|
||||
requiredMessage,
|
||||
label: labelUsername,
|
||||
inputmode: this.usernameIsEmail ? 'email' : ''
|
||||
inputmode: this.usernameIsEmail ? 'email' : '',
|
||||
});
|
||||
this._passwordInput = createInput({
|
||||
id: 'password-input',
|
||||
@@ -163,10 +173,13 @@ export default class UmbAuthElement extends LitElement {
|
||||
autocomplete: 'current-password',
|
||||
requiredMessage,
|
||||
label: labelPassword,
|
||||
inputmode: ''
|
||||
inputmode: '',
|
||||
});
|
||||
this._usernameLabel = createLabel({ forId: 'username-input', localizeAlias: this.usernameIsEmail ? 'general_email' : 'user_username' });
|
||||
this._passwordLabel = createLabel({ forId: 'password-input', localizeAlias: 'user_password' });
|
||||
this._usernameLabel = createLabel({
|
||||
forId: 'username-input',
|
||||
localizeAlias: this.usernameIsEmail ? 'general_email' : 'general_username',
|
||||
});
|
||||
this._passwordLabel = createLabel({forId: 'password-input', localizeAlias: 'general_password'});
|
||||
|
||||
this._usernameLayoutItem = createFormLayoutItem(this._usernameLabel, this._usernameInput);
|
||||
this._passwordLayoutItem = createFormLayoutItem(this._passwordLabel, this._passwordInput);
|
||||
@@ -178,12 +191,13 @@ export default class UmbAuthElement extends LitElement {
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<umb-auth-layout
|
||||
background-image=${ifDefined(this.backgroundImage)}
|
||||
logo-image=${ifDefined(this.logoImage)}>
|
||||
${this._renderFlowAndStatus()}
|
||||
</umb-auth-layout>
|
||||
`;
|
||||
<umb-auth-layout
|
||||
background-image=${ifDefined(this.backgroundImage)}
|
||||
logo-image=${ifDefined(this.logoImage)}
|
||||
logo-image-alternative=${ifDefined(this.logoImageAlternative)}>
|
||||
${this._renderFlowAndStatus()}
|
||||
</umb-auth-layout>
|
||||
`;
|
||||
}
|
||||
|
||||
private _renderFlowAndStatus() {
|
||||
@@ -192,21 +206,31 @@ export default class UmbAuthElement extends LitElement {
|
||||
const status = searchParams.get('status');
|
||||
|
||||
if (status === 'resetCodeExpired') {
|
||||
return html` <umb-error-layout
|
||||
header="Hi there"
|
||||
message=${until(
|
||||
umbLocalizationContext.localize('login_resetCodeExpired', undefined, 'The link you have clicked on is invalid or has expired')
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
return html`
|
||||
<umb-error-layout
|
||||
header="Hi there"
|
||||
message=${until(
|
||||
umbLocalizationContext.localize(
|
||||
'login_resetCodeExpired',
|
||||
undefined,
|
||||
'The link you have clicked on is invalid or has expired'
|
||||
)
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
}
|
||||
|
||||
if (flow === 'invite-user' && status === 'false') {
|
||||
return html` <umb-error-layout
|
||||
header="Hi there"
|
||||
message=${until(
|
||||
umbLocalizationContext.localize('user_userinviteExpiredMessage', undefined, 'Welcome to Umbraco! Unfortunately your invite has expired. Please contact your administrator and ask them to resend it.'),
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
return html`
|
||||
<umb-error-layout
|
||||
header="Hi there"
|
||||
message=${until(
|
||||
umbLocalizationContext.localize(
|
||||
'user_userinviteExpiredMessage',
|
||||
undefined,
|
||||
'Welcome to Umbraco! Unfortunately your invite has expired. Please contact your administrator and ask them to resend it.'
|
||||
)
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
}
|
||||
|
||||
// validate
|
||||
@@ -218,22 +242,27 @@ export default class UmbAuthElement extends LitElement {
|
||||
|
||||
switch (flow) {
|
||||
case 'mfa':
|
||||
return html`<umb-mfa-page></umb-mfa-page>`;
|
||||
return html`
|
||||
<umb-mfa-page></umb-mfa-page>`;
|
||||
case 'reset':
|
||||
return html`<umb-reset-password-page></umb-reset-password-page>`;
|
||||
return html`
|
||||
<umb-reset-password-page></umb-reset-password-page>`;
|
||||
case 'reset-password':
|
||||
return html`<umb-new-password-page></umb-new-password-page>`;
|
||||
return html`
|
||||
<umb-new-password-page></umb-new-password-page>`;
|
||||
case 'invite-user':
|
||||
return html`<umb-invite-page></umb-invite-page>`;
|
||||
return html`
|
||||
<umb-invite-page></umb-invite-page>`;
|
||||
|
||||
default:
|
||||
return html`<umb-login-page
|
||||
?allow-password-reset=${this.allowPasswordReset}
|
||||
?username-is-email=${this.usernameIsEmail}>
|
||||
<slot></slot>
|
||||
<slot name="subheadline" slot="subheadline"></slot>
|
||||
<slot name="external" slot="external"></slot>
|
||||
</umb-login-page>`;
|
||||
return html`
|
||||
<umb-login-page
|
||||
?allow-password-reset=${this.allowPasswordReset}
|
||||
?username-is-email=${this.usernameIsEmail}>
|
||||
<slot></slot>
|
||||
<slot name="subheadline" slot="subheadline"></slot>
|
||||
<slot name="external" slot="external"></slot>
|
||||
</umb-login-page>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ export default class UmbBackToLoginButtonElement extends LitElement {
|
||||
}
|
||||
|
||||
#handleClick() {
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', {composed: true, detail: {flow: 'login'}}));
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', { composed: true, detail: { flow: 'login' } }));
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
|
||||
@@ -6,10 +6,13 @@ import { until } from 'lit/directives/until.js';
|
||||
import { loadCustomView, renderCustomView } from '../utils/load-custom-view.function.js';
|
||||
import { umbLocalizationContext } from '../external/localization/localization-context.js';
|
||||
|
||||
type UserViewState = 'loggingIn' | 'loggedIn' | 'loggedOut' | 'timedOut';
|
||||
|
||||
type ExternalLoginCustomViewElement = HTMLElement & {
|
||||
displayName: string;
|
||||
providerName: string;
|
||||
externalLoginUrl: string;
|
||||
displayName?: string;
|
||||
providerName?: string;
|
||||
externalLoginUrl?: string;
|
||||
userViewState?: UserViewState;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -19,188 +22,219 @@ type ExternalLoginCustomViewElement = HTMLElement & {
|
||||
*/
|
||||
@customElement('umb-external-login-provider')
|
||||
export class UmbExternalLoginProviderElement extends LitElement {
|
||||
/**
|
||||
* Gets or sets the path to the module that should be loaded as the custom view.
|
||||
* The module should export a default class that extends HTMLElement.
|
||||
*
|
||||
* Setting this property will cause the default view to be hidden and the custom view to be loaded.
|
||||
* The icon, button look and button color will be ignored.
|
||||
*
|
||||
* @example App_Plugins/MyPackage/MyCustomLoginView.js
|
||||
* @attr custom-view
|
||||
*/
|
||||
@property({ attribute: 'custom-view' })
|
||||
customView?: string;
|
||||
/**
|
||||
* Gets or sets the path to the module that should be loaded as the custom view.
|
||||
* The module should export a default class that extends HTMLElement.
|
||||
*
|
||||
* Setting this property will cause the default view to be hidden and the custom view to be loaded.
|
||||
* The icon, button look and button color will be ignored.
|
||||
*
|
||||
* @example App_Plugins/MyPackage/MyCustomLoginView.js
|
||||
* @attr custom-view
|
||||
*/
|
||||
@property({attribute: 'custom-view'})
|
||||
customView?: string;
|
||||
|
||||
/**
|
||||
* Gets or sets the display name of the provider.
|
||||
*
|
||||
* @attr display-name
|
||||
* @example Google
|
||||
*/
|
||||
@property({ attribute: 'display-name' })
|
||||
displayName = '';
|
||||
/**
|
||||
* Gets or sets the display name of the provider.
|
||||
*
|
||||
* @attr display-name
|
||||
* @example Google
|
||||
*/
|
||||
@property({attribute: 'display-name'})
|
||||
displayName = '';
|
||||
|
||||
/**
|
||||
* Gets or sets the name of the provider (otherwise known as authentication type).
|
||||
*
|
||||
* @attr provider-name
|
||||
* @example Umbraco.Google
|
||||
*/
|
||||
@property({ attribute: 'provider-name' })
|
||||
providerName = '';
|
||||
/**
|
||||
* Gets or sets the name of the provider (otherwise known as authentication type).
|
||||
*
|
||||
* @attr provider-name
|
||||
* @example Umbraco.Google
|
||||
*/
|
||||
@property({attribute: 'provider-name'})
|
||||
providerName = '';
|
||||
|
||||
/**
|
||||
* Gets or sets the url to the external login provider.
|
||||
*
|
||||
* @attr external-login-url
|
||||
* @example /umbraco/ExternalLogin
|
||||
*/
|
||||
@property({ attribute: 'external-login-url' })
|
||||
get externalLoginUrl() {
|
||||
return this.#externalLoginUrl;
|
||||
}
|
||||
set externalLoginUrl(value: string) {
|
||||
const tempUrl = new URL(value, window.location.origin);
|
||||
const searchParams = new URLSearchParams(tempUrl.search);
|
||||
tempUrl.searchParams.append('redirectUrl', decodeURIComponent(searchParams.get('returnPath') ?? ''));
|
||||
this.#externalLoginUrl = tempUrl.pathname + tempUrl.search;
|
||||
}
|
||||
/**
|
||||
* Gets or sets the view state of the user. This indicates in which state the user is in the login process,
|
||||
* which can be used to determine where the external-login-provider is being shown.
|
||||
*
|
||||
* @attr user-view-state
|
||||
* @example loggingIn
|
||||
* @default loggingIn
|
||||
*/
|
||||
@property({attribute: 'user-view-state'})
|
||||
userViewState: UserViewState = 'loggingIn';
|
||||
|
||||
/**
|
||||
* Gets or sets the icon to display next to the provider name.
|
||||
* This should be the name of an icon in the Umbraco Backoffice icon set.
|
||||
*
|
||||
* @attr icon
|
||||
* @example icon-google-fill
|
||||
* @default icon-lock
|
||||
*/
|
||||
@property({ attribute: 'icon' })
|
||||
icon = 'icon-lock';
|
||||
/**
|
||||
* Gets or sets the url to the external login provider.
|
||||
*
|
||||
* @attr external-login-url
|
||||
* @example /umbraco/ExternalLogin
|
||||
*/
|
||||
@property({attribute: 'external-login-url'})
|
||||
set externalLoginUrl(value: string) {
|
||||
const tempUrl = new URL(value, window.location.origin);
|
||||
const searchParams = new URLSearchParams(tempUrl.search);
|
||||
tempUrl.searchParams.append('redirectUrl', decodeURIComponent(searchParams.get('returnPath') ?? ''));
|
||||
this.#externalLoginUrl = tempUrl.pathname + tempUrl.search;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or sets the look of the underlying uui-button.
|
||||
*
|
||||
* @attr button-look
|
||||
* @example outline
|
||||
* @default outline
|
||||
* @see https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors
|
||||
*/
|
||||
@property({ attribute: 'button-look' })
|
||||
buttonLook: InterfaceLook = 'outline';
|
||||
get externalLoginUrl() {
|
||||
return this.#externalLoginUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or sets the color of the underlying uui-button.
|
||||
*
|
||||
* @attr button-color
|
||||
* @example danger
|
||||
* @default default
|
||||
* @see https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors
|
||||
*/
|
||||
@property({ attribute: 'button-color' })
|
||||
buttonColor: InterfaceColor = 'default';
|
||||
/**
|
||||
* Gets or sets the icon to display next to the provider name.
|
||||
* This should be the name of an icon in the Umbraco Backoffice icon set.
|
||||
*
|
||||
* @attr icon
|
||||
* @example icon-google-fill
|
||||
* @default icon-lock
|
||||
*/
|
||||
@property({attribute: 'icon'})
|
||||
icon = 'icon-lock';
|
||||
|
||||
#externalLoginUrl = '';
|
||||
/**
|
||||
* Gets or sets the look of the underlying uui-button.
|
||||
*
|
||||
* @attr button-look
|
||||
* @example outline
|
||||
* @default outline
|
||||
* @see https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors
|
||||
*/
|
||||
@property({attribute: 'button-look'})
|
||||
buttonLook: InterfaceLook = 'outline';
|
||||
|
||||
protected render() {
|
||||
return this.customView
|
||||
? until(this.renderCustomView(), html`<uui-loader-bar></uui-loader-bar>`)
|
||||
: this.renderDefaultView();
|
||||
}
|
||||
/**
|
||||
* Gets or sets the color of the underlying uui-button.
|
||||
*
|
||||
* @attr button-color
|
||||
* @example danger
|
||||
* @default default
|
||||
* @see https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors
|
||||
*/
|
||||
@property({attribute: 'button-color'})
|
||||
buttonColor: InterfaceColor = 'default';
|
||||
|
||||
protected renderDefaultView() {
|
||||
return html`
|
||||
<form id="defaultView" method="post" action=${this.externalLoginUrl}>
|
||||
<uui-button
|
||||
type="submit"
|
||||
name="provider"
|
||||
.value=${this.providerName}
|
||||
title=${`Login using your ${this.displayName} account`}
|
||||
.label=${until(umbLocalizationContext.localize('login_signInWith', undefined, 'Sign in with')) + ' ' + this.displayName}
|
||||
.look=${this.buttonLook}
|
||||
.color=${this.buttonColor}>
|
||||
#externalLoginUrl = '';
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
const searchParams = new URLSearchParams(window.location.search);
|
||||
const isLogout = searchParams.get('logout') === 'true';
|
||||
|
||||
if (isLogout) {
|
||||
this.userViewState = 'loggedOut';
|
||||
}
|
||||
}
|
||||
|
||||
protected render() {
|
||||
return this.customView
|
||||
? until(this.renderCustomView(), html`
|
||||
<uui-loader-bar></uui-loader-bar>`)
|
||||
: this.renderDefaultView();
|
||||
}
|
||||
|
||||
protected renderDefaultView() {
|
||||
return html`
|
||||
<form id="defaultView" method="post" action=${this.externalLoginUrl}>
|
||||
<uui-button
|
||||
type="submit"
|
||||
name="provider"
|
||||
.value=${this.providerName}
|
||||
.label=${until(umbLocalizationContext.localize('login_signInWith', undefined, 'Sign in with').then(str => `${str} ${this.displayName}`))}
|
||||
.look=${this.buttonLook}
|
||||
.color=${this.buttonColor}>
|
||||
${this.displayName
|
||||
? html`
|
||||
<div>
|
||||
<uui-icon name=${this.icon}></uui-icon>
|
||||
<umb-localize key="login_signInWith">Sign in with</umb-localize>
|
||||
${this.displayName}
|
||||
</div>
|
||||
`
|
||||
: nothing}
|
||||
<slot></slot>
|
||||
</uui-button>
|
||||
</form>
|
||||
`;
|
||||
}
|
||||
? html`
|
||||
<div>
|
||||
<uui-icon name=${this.icon}></uui-icon>
|
||||
<umb-localize key="login_signInWith">Sign in with</umb-localize>
|
||||
${this.displayName}
|
||||
</div>
|
||||
`
|
||||
: nothing}
|
||||
<slot></slot>
|
||||
</uui-button>
|
||||
</form>
|
||||
`;
|
||||
}
|
||||
|
||||
protected async renderCustomView() {
|
||||
try {
|
||||
if (!this.customView) return;
|
||||
protected async renderCustomView() {
|
||||
try {
|
||||
if (!this.customView) return;
|
||||
|
||||
const customView = await loadCustomView<ExternalLoginCustomViewElement>(this.customView);
|
||||
const customView = await loadCustomView<ExternalLoginCustomViewElement>(this.customView);
|
||||
|
||||
if (typeof customView === 'object') {
|
||||
customView.displayName = this.displayName;
|
||||
customView.providerName = this.providerName;
|
||||
customView.externalLoginUrl = this.externalLoginUrl;
|
||||
}
|
||||
if (typeof customView === 'object') {
|
||||
customView.displayName = this.displayName;
|
||||
customView.providerName = this.providerName;
|
||||
customView.externalLoginUrl = this.externalLoginUrl;
|
||||
customView.userViewState = this.userViewState;
|
||||
}
|
||||
|
||||
return renderCustomView(customView);
|
||||
} catch (error: unknown) {
|
||||
console.group('[External login] Failed to load custom view');
|
||||
console.log('Provider name', this.providerName);
|
||||
console.log('Element reference', this);
|
||||
console.log('Custom view', this.customView);
|
||||
console.error('Failed to load custom view:', error);
|
||||
console.groupEnd();
|
||||
}
|
||||
}
|
||||
return renderCustomView(customView);
|
||||
} catch (error: unknown) {
|
||||
console.group('[External login] Failed to load custom view');
|
||||
console.log('Provider name', this.providerName);
|
||||
console.log('Element reference', this);
|
||||
console.log('Custom view', this.customView);
|
||||
console.error('Failed to load custom view:', error);
|
||||
console.groupEnd();
|
||||
}
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#defaultView uui-button {
|
||||
width: 100%;
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
#defaultView uui-button div {
|
||||
/* TODO: Remove this when uui-button has setting for aligning content */
|
||||
position: absolute;
|
||||
left: 9px;
|
||||
margin: auto;
|
||||
text-align: left;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
#defaultView button {
|
||||
font-size: var(--uui-button-font-size);
|
||||
border: 1px solid var(--uui-color-border);
|
||||
border-radius: var(--uui-border-radius);
|
||||
width: 100%;
|
||||
padding: 9px;
|
||||
text-align: left;
|
||||
background-color: var(--uui-color-surface);
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--uui-size-space-2);
|
||||
box-sizing: border-box;
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#defaultView uui-button {
|
||||
width: 100%;
|
||||
--uui-button-font-weight: 400;
|
||||
}
|
||||
|
||||
line-height: 1.1; /* makes the text vertically centered */
|
||||
color: var(--uui-color-interactive);
|
||||
}
|
||||
#defaultView uui-button div {
|
||||
/* TODO: Remove this when uui-button has setting for aligning content */
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
margin: auto;
|
||||
transform: translateY(-50%);
|
||||
text-align: left;
|
||||
padding-left: 15px;
|
||||
}
|
||||
|
||||
#defaultView button:hover {
|
||||
color: var(--uui-color-interactive-emphasis);
|
||||
border-color: var(--uui-color-border-standalone);
|
||||
}
|
||||
`,
|
||||
];
|
||||
#defaultView uui-icon {
|
||||
color: #00000080;
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
#defaultView button {
|
||||
font-size: var(--uui-button-font-size);
|
||||
border: 1px solid var(--uui-color-border);
|
||||
border-radius: var(--uui-button-border-radius);
|
||||
width: 100%;
|
||||
padding: 9px;
|
||||
text-align: left;
|
||||
background-color: var(--uui-color-surface);
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--uui-size-space-2);
|
||||
box-sizing: border-box;
|
||||
|
||||
line-height: 1.1; /* makes the text vertically centered */
|
||||
color: var(--uui-color-interactive);
|
||||
}
|
||||
|
||||
#defaultView button:hover {
|
||||
color: var(--uui-color-interactive-emphasis);
|
||||
border-color: var(--uui-color-border-standalone);
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-external-login-provider': UmbExternalLoginProviderElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-external-login-provider': UmbExternalLoginProviderElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,80 +1,214 @@
|
||||
import { css, CSSResultGroup, html, LitElement, nothing } from 'lit';
|
||||
import { css, CSSResultGroup, html, LitElement, nothing, PropertyValueMap } from 'lit';
|
||||
import { customElement, property } from 'lit/decorators.js';
|
||||
import { styleMap } from 'lit/directives/style-map.js';
|
||||
import { when } from 'lit/directives/when.js';
|
||||
|
||||
/**
|
||||
* The auth layout component.
|
||||
*
|
||||
* @element umb-auth-layout
|
||||
* @slot - The content of the layout
|
||||
* @cssprop --umb-login-background - The background of the layout (default: #f4f4f4)
|
||||
* @cssprop --umb-login-image - The background of the image wrapper (default: the value of the backgroundImage property)
|
||||
* @cssprop --umb-login-image-display - The display of the image wrapper (default: flex)
|
||||
* @cssprop --umb-login-content-background - The background of the content wrapper (default: none)
|
||||
* @cssprop --umb-login-content-display - The display of the content wrapper (default: flex)
|
||||
* @cssprop --umb-login-content-width - The width of the content wrapper (default: 100%)
|
||||
* @cssprop --umb-login-content-height - The height of the content wrapper (default: 100%)
|
||||
* @cssprop --umb-login-align-items - The align-items of the main wrapper (default: unset)
|
||||
* @cssprop --umb-curves-color - The color of the curves (default: #f5c1bc)
|
||||
* @cssprop --umb-curves-display - The display of the curves (default: inline)
|
||||
*/
|
||||
@customElement('umb-auth-layout')
|
||||
export class UmbAuthLayoutElement extends LitElement {
|
||||
@property({ attribute: 'background-image' })
|
||||
backgroundImage?: string;
|
||||
@property({ attribute: 'background-image' })
|
||||
backgroundImage?: string;
|
||||
|
||||
@property({ attribute: 'logo-image' })
|
||||
logoImage?: string;
|
||||
@property({ attribute: 'logo-image' })
|
||||
logoImage?: string;
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div id="background" style=${styleMap({ backgroundImage: `url('${this.backgroundImage}')` })} aria-hidden="true"></div>
|
||||
@property({ attribute: 'logo-image-alternative' })
|
||||
logoImageAlternative?: string;
|
||||
|
||||
${this.logoImage ? html`<div id="logo" aria-hidden="true"><img src=${this.logoImage} alt="" /></div>` : nothing}
|
||||
protected updated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {
|
||||
super.updated(_changedProperties);
|
||||
|
||||
<div id="container">
|
||||
<div id="box">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
if (_changedProperties.has<keyof this>('backgroundImage')) {
|
||||
this.style.setProperty('--logo-alternative-display', this.backgroundImage ? 'none' : 'unset');
|
||||
this.style.setProperty('--image', `url('${this.backgroundImage}') no-repeat center center/cover`);
|
||||
}
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#background {
|
||||
position: fixed;
|
||||
overflow: hidden;
|
||||
background-position: 50%;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
}
|
||||
#renderImageContainer() {
|
||||
if (!this.backgroundImage) return nothing;
|
||||
|
||||
#logo {
|
||||
position: fixed;
|
||||
top: var(--uui-size-space-5);
|
||||
left: var(--uui-size-space-5);
|
||||
height: 30px;
|
||||
}
|
||||
return html`
|
||||
<div id="image-container">
|
||||
<div id="image">
|
||||
<svg
|
||||
id="curve-top"
|
||||
width="1746"
|
||||
height="1374"
|
||||
viewBox="0 0 1746 1374"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8 1C61.5 722.5 206.5 1366.5 1745.5 1366.5" stroke="currentColor" stroke-width="15"/>
|
||||
</svg>
|
||||
<svg
|
||||
id="curve-bottom"
|
||||
width="1364"
|
||||
height="552"
|
||||
viewBox="0 0 1364 552"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1 8C387 24 1109 11 1357 548" stroke="currentColor" stroke-width="15"/>
|
||||
</svg>
|
||||
|
||||
#logo img {
|
||||
height: 100%;
|
||||
}
|
||||
${when(
|
||||
this.logoImage,
|
||||
() => html`<img id="logo-on-image" src=${this.logoImage} alt="logo" aria-hidden="true"/>`
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
#container {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
}
|
||||
#renderContent() {
|
||||
return html`
|
||||
<div id="content-container">
|
||||
<div id="content">
|
||||
<slot></slot>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
#box {
|
||||
width: 500px;
|
||||
padding: var(--uui-size-layout-3);
|
||||
background-color: var(--uui-color-surface-alt);
|
||||
box-sizing: border-box;
|
||||
box-shadow: var(--uui-shadow-depth-5);
|
||||
border-radius: calc(var(--uui-border-radius) * 2);
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<div id=${this.backgroundImage ? 'main' : 'main-no-image'}>
|
||||
${this.#renderImageContainer()} ${this.#renderContent()}
|
||||
</div>
|
||||
${when(
|
||||
this.logoImageAlternative,
|
||||
() => html`<img id="logo-on-background" src=${this.logoImageAlternative!} alt="logo" aria-hidden="true"/>`
|
||||
)}
|
||||
`;
|
||||
}
|
||||
|
||||
#email,
|
||||
#password {
|
||||
width: 100%;
|
||||
}
|
||||
`,
|
||||
];
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
--uui-color-interactive: #283a97;
|
||||
--uui-button-border-radius: 45px;
|
||||
--uui-color-default: var(--uui-color-interactive);
|
||||
--uui-button-height: 42px;
|
||||
--uui-select-height: 38px;
|
||||
|
||||
--input-height: 40px;
|
||||
--header-font-size: 3rem;
|
||||
--header-secondary-font-size: 2.4rem;
|
||||
--curves-color: var(--umb-curves-color, #f5c1bc);
|
||||
--curves-display: var(--umb-curves-display, inline);
|
||||
|
||||
display: block;
|
||||
background: var(--umb-login-background, #f4f4f4);
|
||||
}
|
||||
|
||||
#main-no-image,
|
||||
#main {
|
||||
max-width: 1920px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
height: 100vh;
|
||||
padding: 8px;
|
||||
box-sizing: border-box;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#image-container {
|
||||
display: var(--umb-login-image-display, none);
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#content-container {
|
||||
background: var(--umb-login-content-background, none);
|
||||
display: var(--umb-login-content-display, flex);
|
||||
width: var(--umb-login-content-width, 100%);
|
||||
height: var(--umb-login-content-height, 100%);
|
||||
box-sizing: border-box;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
#content {
|
||||
max-width: 360px;
|
||||
margin: auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#image {
|
||||
background: var(--umb-login-image, var(--image));
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 38px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
color: var(--curves-color);
|
||||
}
|
||||
|
||||
#image svg {
|
||||
position: absolute;
|
||||
width: 45%;
|
||||
height: fit-content;
|
||||
display: var(--curves-display);
|
||||
}
|
||||
|
||||
#curve-top {
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#curve-bottom {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
#logo-on-image,
|
||||
#logo-on-background {
|
||||
position: absolute;
|
||||
top: 24px;
|
||||
left: 24px;
|
||||
height: 55px;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 900px) {
|
||||
:host {
|
||||
--header-font-size: 4rem;
|
||||
}
|
||||
|
||||
#main {
|
||||
padding: 32px;
|
||||
padding-right: 0;
|
||||
align-items: var(--umb-login-align-items, unset);
|
||||
}
|
||||
|
||||
#image-container {
|
||||
display: var(--umb-login-image-display, block);
|
||||
}
|
||||
|
||||
#content-container {
|
||||
display: var(--umb-login-content-display, flex);
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
#logo-on-background {
|
||||
display: var(--logo-alternative-display);
|
||||
}
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-auth-layout': UmbAuthLayoutElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-auth-layout': UmbAuthLayoutElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,59 +3,65 @@ import { customElement, property } from 'lit/decorators.js';
|
||||
|
||||
@customElement('umb-confirmation-layout')
|
||||
export default class UmbConfirmationLayoutElement extends LitElement {
|
||||
@property({ type: String })
|
||||
header = '';
|
||||
@property({ type: String })
|
||||
header = '';
|
||||
|
||||
@property({ type: String })
|
||||
message = '';
|
||||
@property({ type: String })
|
||||
message = '';
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div id="header">
|
||||
<h2>${this.header}</h2>
|
||||
<span>${this.message}</span>
|
||||
</div>
|
||||
render() {
|
||||
return html`
|
||||
<header id="header">
|
||||
<h1>${this.header}</h1>
|
||||
<span>${this.message}</span>
|
||||
</header>
|
||||
|
||||
<umb-back-to-login-button></umb-back-to-login-button>
|
||||
<umb-back-to-login-button></umb-back-to-login-button>
|
||||
|
||||
<slot></slot>
|
||||
`;
|
||||
}
|
||||
<slot></slot>
|
||||
`;
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-1);
|
||||
}
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
#header h2 {
|
||||
margin: 0px;
|
||||
font-weight: bold;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
uui-button {
|
||||
width: 100%;
|
||||
margin-top: var(--uui-size-space-5);
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
`,
|
||||
];
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-1);
|
||||
}
|
||||
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#header h1 {
|
||||
margin: 0;
|
||||
font-weight: 400;
|
||||
font-size: var(--header-secondary-font-size);
|
||||
color: var(--uui-color-interactive);
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
uui-button {
|
||||
width: 100%;
|
||||
margin-top: var(--uui-size-space-5);
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-confirmation-layout': UmbConfirmationLayoutElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-confirmation-layout': UmbConfirmationLayoutElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,57 +3,63 @@ import { customElement, property } from 'lit/decorators.js';
|
||||
|
||||
@customElement('umb-error-layout')
|
||||
export default class UmbErrorLayoutElement extends LitElement {
|
||||
@property({ type: String })
|
||||
header = '';
|
||||
@property({ type: String })
|
||||
header = '';
|
||||
|
||||
@property({ type: String })
|
||||
message = '';
|
||||
@property({ type: String })
|
||||
message = '';
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<div id="header">
|
||||
<h2>${this.header}</h2>
|
||||
<span>${this.message}</span>
|
||||
</div>
|
||||
<slot></slot>
|
||||
<umb-back-to-login-button></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
<header id="header">
|
||||
<h1>${this.header}</h1>
|
||||
<span>${this.message}</span>
|
||||
</header>
|
||||
<slot></slot>
|
||||
<umb-back-to-login-button></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-1);
|
||||
}
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
#header h2 {
|
||||
margin: 0;
|
||||
font-weight: bold;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
::slotted(uui-button) {
|
||||
width: 100%;
|
||||
margin-top: var(--uui-size-space-5);
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
`,
|
||||
];
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-1);
|
||||
}
|
||||
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#header h1 {
|
||||
margin: 0;
|
||||
font-weight: 400;
|
||||
font-size: var(--header-secondary-font-size);
|
||||
color: var(--uui-color-interactive);
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
::slotted(uui-button) {
|
||||
width: 100%;
|
||||
margin-top: var(--uui-size-space-5);
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-error-layout': UmbErrorLayoutElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-error-layout': UmbErrorLayoutElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,77 +1,92 @@
|
||||
import { css, CSSResultGroup, html, LitElement, nothing } from 'lit';
|
||||
import { customElement, property, queryAssignedElements } from 'lit/decorators.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
import { umbLocalizationContext } from '../../external/localization/localization-context.js';
|
||||
|
||||
@customElement('umb-external-login-providers-layout')
|
||||
export class UmbExternalLoginProvidersLayoutElement extends LitElement {
|
||||
@property({ type: Boolean, attribute: 'divider' })
|
||||
showDivider = true;
|
||||
@property({ type: Boolean, attribute: 'divider' })
|
||||
showDivider = true;
|
||||
|
||||
@queryAssignedElements({ flatten: true })
|
||||
protected slottedElements?: HTMLElement[];
|
||||
@queryAssignedElements({ flatten: true })
|
||||
protected slottedElements?: HTMLElement[];
|
||||
|
||||
firstUpdated() {
|
||||
!!this.slottedElements?.length ? this.toggleAttribute('empty', false) : this.toggleAttribute('empty', true);
|
||||
}
|
||||
firstUpdated() {
|
||||
!!this.slottedElements?.length ? this.toggleAttribute('empty', false) : this.toggleAttribute('empty', true);
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
${this.showDivider ? html` <div id="divider" aria-hidden="true"><span><umb-localize key="general_or">Or</umb-localize></span></div> ` : nothing}
|
||||
<div>
|
||||
<slot></slot>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
render() {
|
||||
return html`
|
||||
${this.showDivider
|
||||
? html`
|
||||
<div id="divider" aria-hidden="true">
|
||||
<span>${until(umbLocalizationContext.localize('general_or', undefined, 'or').then(str => str.toLocaleLowerCase()))}</span>
|
||||
</div>
|
||||
`
|
||||
: nothing}
|
||||
<div>
|
||||
<slot></slot>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
:host {
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
:host([empty]) {
|
||||
display: none;
|
||||
}
|
||||
:host([empty]) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
slot {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-4);
|
||||
}
|
||||
slot {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-4);
|
||||
}
|
||||
|
||||
#divider {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
color: var(--uui-color-interactive);
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
#divider {
|
||||
width: calc(100% - 18px);
|
||||
margin: 0 auto;
|
||||
margin-bottom: 16px;
|
||||
text-align: center;
|
||||
z-index: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#divider span {
|
||||
background-color: var(--uui-color-surface-alt);
|
||||
padding: 0 9px;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
#divider span {
|
||||
padding-inline: 10px;
|
||||
position: relative;
|
||||
color: var(--uui-color-border-emphasis);
|
||||
}
|
||||
|
||||
#divider::before {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
background-color: var(--uui-color-border);
|
||||
position: absolute;
|
||||
top: calc(50% + 1px);
|
||||
transform: translateY(-50%);
|
||||
z-index: -1;
|
||||
}
|
||||
`,
|
||||
];
|
||||
#divider span::before,
|
||||
#divider span::after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 500px; /* Arbitrary value, just be bigger than 50% of the max width of the container */
|
||||
height: 1px;
|
||||
background-color: var(--uui-color-border);
|
||||
position: absolute;
|
||||
top: calc(50% + 1px);
|
||||
}
|
||||
|
||||
#divider span::before {
|
||||
right: 100%;
|
||||
}
|
||||
|
||||
#divider span::after {
|
||||
left: 100%;
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-external-login-providers-layout': UmbExternalLoginProvidersLayoutElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-external-login-providers-layout': UmbExternalLoginProvidersLayoutElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,202 +1,234 @@
|
||||
import type { UUIButtonState, UUIInputPasswordElement } from '@umbraco-ui/uui';
|
||||
import { CSSResultGroup, LitElement, css, html, nothing } from 'lit';
|
||||
import { customElement, property, query, state } from 'lit/decorators.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
import type {UUIButtonState, UUIInputPasswordElement} from '@umbraco-ui/uui';
|
||||
import {CSSResultGroup, LitElement, css, html, nothing} from 'lit';
|
||||
import {customElement, property, query, state} from 'lit/decorators.js';
|
||||
import {until} from 'lit/directives/until.js';
|
||||
|
||||
import { umbAuthContext } from '../../context/auth.context.js';
|
||||
import { umbLocalizationContext } from '../../external/localization/localization-context.js';
|
||||
import {umbAuthContext} from '../../context/auth.context.js';
|
||||
import {umbLocalizationContext} from '../../external/localization/localization-context.js';
|
||||
|
||||
@customElement('umb-new-password-layout')
|
||||
export default class UmbNewPasswordLayoutElement extends LitElement {
|
||||
@query('#password')
|
||||
passwordElement!: UUIInputPasswordElement;
|
||||
@query('#password')
|
||||
passwordElement!: UUIInputPasswordElement;
|
||||
|
||||
@query('#confirmPassword')
|
||||
confirmPasswordElement!: UUIInputPasswordElement;
|
||||
@query('#confirmPassword')
|
||||
confirmPasswordElement!: UUIInputPasswordElement;
|
||||
|
||||
@property()
|
||||
state: UUIButtonState = undefined;
|
||||
@property()
|
||||
state: UUIButtonState = undefined;
|
||||
|
||||
@property()
|
||||
error: string = '';
|
||||
@property()
|
||||
error: string = '';
|
||||
|
||||
@property()
|
||||
userId: any;
|
||||
@property()
|
||||
userId: any;
|
||||
|
||||
@property()
|
||||
userName?: string;
|
||||
@property()
|
||||
userName?: string;
|
||||
|
||||
@state()
|
||||
passwordConfig?: {
|
||||
allowManuallyChangingPassword: boolean;
|
||||
minNonAlphaNumericChars: number;
|
||||
minPasswordLength: number;
|
||||
};
|
||||
@state()
|
||||
passwordConfig?: {
|
||||
allowManuallyChangingPassword: boolean;
|
||||
minNonAlphaNumericChars: number;
|
||||
minPasswordLength: number;
|
||||
};
|
||||
|
||||
protected async firstUpdated(_changedProperties: any) {
|
||||
super.firstUpdated(_changedProperties);
|
||||
protected async firstUpdated(_changedProperties: any) {
|
||||
super.firstUpdated(_changedProperties);
|
||||
|
||||
if (this.userId) {
|
||||
const response = await umbAuthContext.getPasswordConfig(this.userId);
|
||||
this.passwordConfig = response.data;
|
||||
}
|
||||
}
|
||||
if (this.userId) {
|
||||
const response = await umbAuthContext.getPasswordConfig(this.userId);
|
||||
this.passwordConfig = response.data;
|
||||
}
|
||||
}
|
||||
|
||||
async #onSubmit(event: Event) {
|
||||
event.preventDefault();
|
||||
if (!this.passwordConfig) return;
|
||||
const form = event.target as HTMLFormElement;
|
||||
async #onSubmit(event: Event) {
|
||||
event.preventDefault();
|
||||
if (!this.passwordConfig) return;
|
||||
const form = event.target as HTMLFormElement;
|
||||
|
||||
this.passwordElement.setCustomValidity('');
|
||||
this.confirmPasswordElement.setCustomValidity('');
|
||||
this.passwordElement.setCustomValidity('');
|
||||
this.confirmPasswordElement.setCustomValidity('');
|
||||
|
||||
if (!form) return;
|
||||
if (!form.checkValidity()) return;
|
||||
if (!form) return;
|
||||
if (!form.checkValidity()) return;
|
||||
|
||||
const formData = new FormData(form);
|
||||
const password = formData.get('password') as string;
|
||||
const passwordConfirm = formData.get('confirmPassword') as string;
|
||||
const formData = new FormData(form);
|
||||
const password = formData.get('password') as string;
|
||||
const passwordConfirm = formData.get('confirmPassword') as string;
|
||||
|
||||
let passwordIsInvalid = false;
|
||||
let passwordIsInvalid = false;
|
||||
|
||||
if (this.passwordConfig.minPasswordLength > 0 && password.length < this.passwordConfig.minPasswordLength) {
|
||||
passwordIsInvalid = true;
|
||||
}
|
||||
if (this.passwordConfig.minPasswordLength > 0 && password.length < this.passwordConfig.minPasswordLength) {
|
||||
passwordIsInvalid = true;
|
||||
}
|
||||
|
||||
if (this.passwordConfig.minNonAlphaNumericChars > 0) {
|
||||
const nonAlphaNumericChars = password.replace(/[a-zA-Z0-9]/g, '').length; //TODO: How should we check for non-alphanumeric chars?
|
||||
if (nonAlphaNumericChars < this.passwordConfig?.minNonAlphaNumericChars) {
|
||||
passwordIsInvalid = true;
|
||||
}
|
||||
}
|
||||
if (this.passwordConfig.minNonAlphaNumericChars > 0) {
|
||||
const nonAlphaNumericChars = password.replace(/[a-zA-Z0-9]/g, '').length; //TODO: How should we check for non-alphanumeric chars?
|
||||
if (nonAlphaNumericChars < this.passwordConfig?.minNonAlphaNumericChars) {
|
||||
passwordIsInvalid = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (passwordIsInvalid) {
|
||||
const passwordValidityText = await umbLocalizationContext.localize('errorHandling_errorInPasswordFormat', [this.passwordConfig.minPasswordLength, this.passwordConfig.minNonAlphaNumericChars], "The password doesn't meet the minimum requirements!");
|
||||
this.passwordElement.setCustomValidity(passwordValidityText);
|
||||
return;
|
||||
}
|
||||
if (passwordIsInvalid) {
|
||||
const passwordValidityText = await umbLocalizationContext.localize(
|
||||
'errorHandling_errorInPasswordFormat',
|
||||
[this.passwordConfig.minPasswordLength, this.passwordConfig.minNonAlphaNumericChars],
|
||||
"The password doesn't meet the minimum requirements!"
|
||||
);
|
||||
this.passwordElement.setCustomValidity(passwordValidityText);
|
||||
return;
|
||||
}
|
||||
|
||||
if (password !== passwordConfirm) {
|
||||
const passwordValidityText = await umbLocalizationContext.localize('user_passwordMismatch', undefined, "The confirmed password doesn't match the new password!");
|
||||
this.confirmPasswordElement.setCustomValidity(passwordValidityText);
|
||||
return;
|
||||
}
|
||||
if (password !== passwordConfirm) {
|
||||
const passwordValidityText = await umbLocalizationContext.localize(
|
||||
'user_passwordMismatch',
|
||||
undefined,
|
||||
"The confirmed password doesn't match the new password!"
|
||||
);
|
||||
this.confirmPasswordElement.setCustomValidity(passwordValidityText);
|
||||
return;
|
||||
}
|
||||
|
||||
this.dispatchEvent(new CustomEvent('submit', { detail: { password } }));
|
||||
}
|
||||
this.dispatchEvent(new CustomEvent('submit', {detail: {password}}));
|
||||
}
|
||||
|
||||
renderHeader() {
|
||||
if (this.userName) {
|
||||
return html`
|
||||
<h2>Hi, ${this.userName}</h2>
|
||||
<umb-localize key="user_userinviteWelcomeMessage">Welcome to Umbraco! Just need to get your password setup and then you're good to go</umb-localize>
|
||||
`;
|
||||
} else {
|
||||
return html`
|
||||
<h2><umb-localize key="user_newPassword">New password</umb-localize></h2>
|
||||
<umb-localize key="login_setPasswordInstruction">Please provide a new password.</umb-localize>
|
||||
`;
|
||||
}
|
||||
}
|
||||
renderHeader() {
|
||||
if (this.userName) {
|
||||
return html`
|
||||
<h1>Hi, ${this.userName}</h1>
|
||||
<span>
|
||||
<umb-localize key="user_userinviteWelcomeMessage">
|
||||
Welcome to Umbraco! Just need to get your password setup and then you're good to go
|
||||
</umb-localize>
|
||||
</span>
|
||||
`;
|
||||
} else {
|
||||
return html`
|
||||
<h1>
|
||||
<umb-localize key="user_newPassword">New password</umb-localize>
|
||||
</h1>
|
||||
<span>
|
||||
<umb-localize key="login_setPasswordInstruction">Please provide a new password.</umb-localize>
|
||||
</span>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<uui-form>
|
||||
<form id="LoginForm" name="login" @submit=${this.#onSubmit}>
|
||||
<div id="header">${this.renderHeader()}</div>
|
||||
<uui-form-layout-item>
|
||||
<uui-label id="passwordLabel" for="password" slot="label" required>
|
||||
<umb-localize key="user_newPassword">New password</umb-localize>
|
||||
</uui-label>
|
||||
<uui-input-password
|
||||
type="password"
|
||||
id="password"
|
||||
name="password"
|
||||
autocomplete="new-password"
|
||||
.label=${until(umbLocalizationContext.localize('user_newPassword', undefined, 'New password'))}
|
||||
required
|
||||
required-message=${until(umbLocalizationContext.localize('user_passwordIsBlank', undefined, 'Your new password cannot be blank!'))}></uui-input-password>
|
||||
</uui-form-layout-item>
|
||||
render() {
|
||||
return html`
|
||||
<uui-form>
|
||||
<form id="LoginForm" name="login" @submit=${this.#onSubmit}>
|
||||
<header id="header">${this.renderHeader()}</header>
|
||||
<uui-form-layout-item>
|
||||
<uui-label id="passwordLabel" for="password" slot="label" required>
|
||||
<umb-localize key="user_newPassword">New password</umb-localize>
|
||||
</uui-label>
|
||||
<uui-input-password
|
||||
type="password"
|
||||
id="password"
|
||||
name="password"
|
||||
autocomplete="new-password"
|
||||
.label=${until(umbLocalizationContext.localize('user_newPassword', undefined, 'New password'))}
|
||||
required
|
||||
required-message=${until(
|
||||
umbLocalizationContext.localize('user_passwordIsBlank', undefined, 'Your new password cannot be blank!')
|
||||
)}></uui-input-password>
|
||||
</uui-form-layout-item>
|
||||
|
||||
<uui-form-layout-item>
|
||||
<uui-label id="confirmPasswordLabel" for="confirmPassword" slot="label" required>
|
||||
<umb-localize key="user_confirmNewPassword">Confirm new password</umb-localize>
|
||||
</uui-label>
|
||||
<uui-input-password
|
||||
type="password"
|
||||
id="confirmPassword"
|
||||
name="confirmPassword"
|
||||
autocomplete="new-password"
|
||||
.label=${until(umbLocalizationContext.localize('user_confirmNewPassword', undefined, 'Confirm new password'))}
|
||||
required
|
||||
required-message=${until(umbLocalizationContext.localize('general_required', undefined, 'Required'))}></uui-input-password>
|
||||
</uui-form-layout-item>
|
||||
<uui-form-layout-item>
|
||||
<uui-label id="confirmPasswordLabel" for="confirmPassword" slot="label" required>
|
||||
<umb-localize key="user_confirmNewPassword">Confirm new password</umb-localize>
|
||||
</uui-label>
|
||||
<uui-input-password
|
||||
type="password"
|
||||
id="confirmPassword"
|
||||
name="confirmPassword"
|
||||
autocomplete="new-password"
|
||||
.label=${until(
|
||||
umbLocalizationContext.localize('user_confirmNewPassword', undefined, 'Confirm new password')
|
||||
)}
|
||||
required
|
||||
required-message=${until(
|
||||
umbLocalizationContext.localize('general_required', undefined, 'Required')
|
||||
)}></uui-input-password>
|
||||
</uui-form-layout-item>
|
||||
|
||||
${this.#renderErrorMessage()}
|
||||
${this.#renderErrorMessage()}
|
||||
|
||||
<uui-button type="submit" label=${until(umbLocalizationContext.localize('general_continue', undefined, 'Continue'))} look="primary" color="default" .state=${this.state}></uui-button>
|
||||
</form>
|
||||
</uui-form>
|
||||
<uui-button
|
||||
type="submit"
|
||||
label=${until(umbLocalizationContext.localize('general_continue', undefined, 'Continue'))}
|
||||
look="primary"
|
||||
color="default"
|
||||
.state=${this.state}></uui-button>
|
||||
</form>
|
||||
</uui-form>
|
||||
|
||||
<umb-back-to-login-button style="margin-top: var(--uui-size-space-6)"></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
<umb-back-to-login-button style="margin-top: var(--uui-size-space-6)"></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
|
||||
#renderErrorMessage() {
|
||||
if (!this.error || this.state !== 'failed') return nothing;
|
||||
#renderErrorMessage() {
|
||||
if (!this.error || this.state !== 'failed') return nothing;
|
||||
|
||||
return html`<span class="text-danger">${this.error}</span>`;
|
||||
}
|
||||
return html`<span class="text-danger">${this.error}</span>`;
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
#header h2 {
|
||||
margin: 0px;
|
||||
font-weight: bold;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
uui-form-layout-item {
|
||||
margin: 0;
|
||||
}
|
||||
h2 {
|
||||
margin: 0px;
|
||||
font-weight: 600;
|
||||
font-size: 1.4rem;
|
||||
margin-bottom: var(--uui-size-space-4);
|
||||
}
|
||||
uui-input-password {
|
||||
width: 100%;
|
||||
}
|
||||
uui-button {
|
||||
width: 100%;
|
||||
margin-top: var(--uui-size-space-5);
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
.text-danger {
|
||||
color: var(--uui-color-danger-standalone);
|
||||
}
|
||||
`,
|
||||
];
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#header h1 {
|
||||
margin: 0;
|
||||
font-weight: 400;
|
||||
font-size: var(--header-secondary-font-size);
|
||||
color: var(--uui-color-interactive);
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
|
||||
uui-form-layout-item {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
uui-input-password {
|
||||
width: 100%;
|
||||
height: var(--input-height);
|
||||
border-radius: var(--uui-border-radius);
|
||||
}
|
||||
|
||||
uui-button {
|
||||
width: 100%;
|
||||
margin-top: var(--uui-size-space-5);
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
|
||||
.text-danger {
|
||||
color: var(--uui-color-danger-standalone);
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-new-password-layout': UmbNewPasswordLayoutElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-new-password-layout': UmbNewPasswordLayoutElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import { customElement } from 'lit/decorators.js';
|
||||
*/
|
||||
@customElement('umb-login-input')
|
||||
export class UmbLoginInputElement extends UUIInputElement {
|
||||
|
||||
/**
|
||||
* Remove the id attribute from the inner input element to avoid duplicate ids.
|
||||
*
|
||||
@@ -18,8 +17,15 @@ export class UmbLoginInputElement extends UUIInputElement {
|
||||
* @protected
|
||||
*/
|
||||
protected firstUpdated() {
|
||||
const innerInput = this.querySelector('input')
|
||||
const innerInput = this.querySelector('input');
|
||||
innerInput?.removeAttribute('id');
|
||||
|
||||
innerInput?.addEventListener('mousedown', () => {
|
||||
this.style.setProperty('--uui-show-focus-outline', '0');
|
||||
});
|
||||
innerInput?.addEventListener('blur', () => {
|
||||
this.style.setProperty('--uui-show-focus-outline', '');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { UUIButtonState } from '@umbraco-ui/uui';
|
||||
import { LitElement, html, nothing } from 'lit';
|
||||
import { LitElement, html } from 'lit';
|
||||
import { customElement, state } from 'lit/decorators.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
|
||||
@@ -8,64 +8,74 @@ import { umbLocalizationContext } from '../../external/localization/localization
|
||||
|
||||
@customElement('umb-invite-page')
|
||||
export default class UmbInvitePageElement extends LitElement {
|
||||
@state()
|
||||
state: UUIButtonState = undefined;
|
||||
@state()
|
||||
state: UUIButtonState = undefined;
|
||||
|
||||
@state()
|
||||
error = '';
|
||||
@state()
|
||||
error = '';
|
||||
|
||||
@state()
|
||||
invitedUser?: any;
|
||||
@state()
|
||||
invitedUser?: any;
|
||||
|
||||
protected async firstUpdated(_changedProperties: any) {
|
||||
super.firstUpdated(_changedProperties);
|
||||
protected async firstUpdated(_changedProperties: any) {
|
||||
super.firstUpdated(_changedProperties);
|
||||
|
||||
const response = await umbAuthContext.getInvitedUser();
|
||||
const response = await umbAuthContext.getInvitedUser();
|
||||
|
||||
if (!response.user?.id) {
|
||||
// The login page should already have redirected the user to an error page. They should never get here.
|
||||
this.error = 'No invited user found';
|
||||
return;
|
||||
}
|
||||
if (!response.user?.id) {
|
||||
// The login page should already have redirected the user to an error page. They should never get here.
|
||||
this.error = 'No invited user found';
|
||||
return;
|
||||
}
|
||||
|
||||
this.invitedUser = response.user;
|
||||
}
|
||||
this.invitedUser = response.user;
|
||||
}
|
||||
|
||||
async #onSubmit(event: CustomEvent) {
|
||||
event.preventDefault();
|
||||
const password = event.detail.password;
|
||||
async #onSubmit(event: CustomEvent) {
|
||||
event.preventDefault();
|
||||
const password = event.detail.password;
|
||||
|
||||
if (!password) return;
|
||||
if (!password) return;
|
||||
|
||||
this.state = 'waiting';
|
||||
const response = await umbAuthContext.newInvitedUserPassword(password);
|
||||
this.state = 'waiting';
|
||||
const response = await umbAuthContext.newInvitedUserPassword(password);
|
||||
|
||||
if (response.error) {
|
||||
this.error = response.error;
|
||||
this.state = 'failed';
|
||||
return;
|
||||
}
|
||||
if (response.error) {
|
||||
this.error = response.error;
|
||||
this.state = 'failed';
|
||||
return;
|
||||
}
|
||||
|
||||
this.state = 'success';
|
||||
window.location.href = umbAuthContext.returnPath;
|
||||
}
|
||||
this.state = 'success';
|
||||
window.location.href = umbAuthContext.returnPath;
|
||||
}
|
||||
|
||||
render() {
|
||||
return this.invitedUser
|
||||
? html`<umb-new-password-layout
|
||||
@submit=${this.#onSubmit}
|
||||
.userId=${this.invitedUser.id}
|
||||
.userName=${this.invitedUser.name}
|
||||
.state=${this.state}
|
||||
.error=${this.error}></umb-new-password-layout>`
|
||||
: this.error
|
||||
? html`<umb-error-layout .header=${until(umbLocalizationContext.localize('general_error', undefined, 'Error'))} .message=${this.error}></umb-error-layout>`
|
||||
: nothing;
|
||||
}
|
||||
render() {
|
||||
return this.invitedUser
|
||||
? html`
|
||||
<umb-new-password-layout
|
||||
@submit=${this.#onSubmit}
|
||||
.userId=${this.invitedUser.id}
|
||||
.userName=${this.invitedUser.name}
|
||||
.state=${this.state}
|
||||
.error=${this.error}></umb-new-password-layout>`
|
||||
: this.error
|
||||
? html`
|
||||
<umb-error-layout
|
||||
.header=${until(umbLocalizationContext.localize('general_error', undefined, 'Error'))}
|
||||
.message=${this.error}></umb-error-layout>`
|
||||
: html`
|
||||
<umb-error-layout
|
||||
header=${until(umbLocalizationContext.localize('general_error', undefined, 'Error'))}
|
||||
message=${until(
|
||||
umbLocalizationContext.localize('errors_defaultError', undefined, 'An unknown failure has occured')
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-invite-page': UmbInvitePageElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-invite-page': UmbInvitePageElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import type { UUIButtonState } from '@umbraco-ui/uui';
|
||||
import { css, CSSResultGroup, html, LitElement, nothing } from 'lit';
|
||||
import { customElement, property, queryAssignedElements, state } from 'lit/decorators.js';
|
||||
import { when } from 'lit/directives/when.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
import type {UUIButtonState} from '@umbraco-ui/uui';
|
||||
import {css, CSSResultGroup, html, LitElement, nothing} from 'lit';
|
||||
import {customElement, property, queryAssignedElements, state} from 'lit/decorators.js';
|
||||
import {when} from 'lit/directives/when.js';
|
||||
import {until} from 'lit/directives/until.js';
|
||||
|
||||
import { umbAuthContext } from '../../context/auth.context.js';
|
||||
import { umbLocalizationContext } from '../../external/localization/localization-context.js';
|
||||
import {umbAuthContext} from '../../context/auth.context.js';
|
||||
import {umbLocalizationContext} from '../../external/localization/localization-context.js';
|
||||
|
||||
@customElement('umb-login-page')
|
||||
export default class UmbLoginPageElement extends LitElement {
|
||||
@property({ type: Boolean, attribute: 'username-is-email' })
|
||||
@property({type: Boolean, attribute: 'username-is-email'})
|
||||
usernameIsEmail = false;
|
||||
|
||||
@queryAssignedElements({ flatten: true })
|
||||
@queryAssignedElements({flatten: true})
|
||||
protected slottedElements?: HTMLFormElement[];
|
||||
|
||||
@property({ type: Boolean, attribute: 'allow-password-reset' })
|
||||
@property({type: Boolean, attribute: 'allow-password-reset'})
|
||||
allowPasswordReset = false;
|
||||
|
||||
@state()
|
||||
@@ -32,7 +32,7 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
#formElement?: HTMLFormElement;
|
||||
|
||||
async #onSlotChanged() {
|
||||
this.#formElement = this.slottedElements?.[0];
|
||||
this.#formElement = this.slottedElements?.find((el) => el.id === 'umb-login-form');
|
||||
|
||||
if (!this.#formElement) return;
|
||||
|
||||
@@ -71,12 +71,12 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
umbAuthContext.twoFactorView = response.twoFactorView;
|
||||
}
|
||||
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', { composed: true, detail: { flow: 'mfa' } }));
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', {composed: true, detail: {flow: 'mfa'}}));
|
||||
return;
|
||||
}
|
||||
|
||||
if (response.error) {
|
||||
this.dispatchEvent(new CustomEvent('umb-login-failed', { bubbles: true, composed: true, detail: response }));
|
||||
this.dispatchEvent(new CustomEvent('umb-login-failed', {bubbles: true, composed: true, detail: response}));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
location.href = returnPath;
|
||||
}
|
||||
|
||||
this.dispatchEvent(new CustomEvent('umb-login-success', { bubbles: true, composed: true, detail: response.data }));
|
||||
this.dispatchEvent(new CustomEvent('umb-login-success', {bubbles: true, composed: true, detail: response.data}));
|
||||
};
|
||||
|
||||
get #greetingLocalizationKey() {
|
||||
@@ -107,48 +107,52 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
|
||||
render() {
|
||||
return html`
|
||||
<h1 id="greeting" class="uui-h3">
|
||||
<umb-localize .key=${this.#greetingLocalizationKey}></umb-localize>
|
||||
</h1>
|
||||
<slot name="subheadline"></slot>
|
||||
${this.disableLocalLogin
|
||||
? nothing
|
||||
: html`
|
||||
<slot @slotchange=${this.#onSlotChanged}></slot>
|
||||
<div id="secondary-actions">
|
||||
${when(
|
||||
umbAuthContext.supportsPersistLogin,
|
||||
() => html`<uui-form-layout-item>
|
||||
<uui-checkbox
|
||||
name="persist"
|
||||
.label=${until(umbLocalizationContext.localize('user_rememberMe', undefined, 'Remember me'))}>
|
||||
<umb-localize key="user_rememberMe">Remember me</umb-localize>
|
||||
</uui-checkbox>
|
||||
</uui-form-layout-item>`
|
||||
)}
|
||||
${when(
|
||||
this.allowPasswordReset,
|
||||
() =>
|
||||
html`<button type="button" id="forgot-password" @click=${this.#handleForgottenPassword}>
|
||||
<umb-localize key="login_forgottenPassword">Forgotten password?</umb-localize>
|
||||
</button>`
|
||||
)}
|
||||
</div>
|
||||
<uui-button
|
||||
type="submit"
|
||||
id="umb-login-button"
|
||||
look="primary"
|
||||
@click=${this.#onSubmitClick}
|
||||
.label=${until(umbLocalizationContext.localize('general_login', undefined, 'Login'), 'Login')}
|
||||
color="default"
|
||||
.state=${this._loginState}></uui-button>
|
||||
<header id="header">
|
||||
<h1 id="greeting">
|
||||
<umb-localize .key=${this.#greetingLocalizationKey}></umb-localize>
|
||||
</h1>
|
||||
<slot name="subheadline"></slot>
|
||||
</header>
|
||||
${this.disableLocalLogin
|
||||
? nothing
|
||||
: html`
|
||||
<slot @slotchange=${this.#onSlotChanged}></slot>
|
||||
<div id="secondary-actions">
|
||||
${when(
|
||||
umbAuthContext.supportsPersistLogin,
|
||||
() => html`
|
||||
<uui-form-layout-item>
|
||||
<uui-checkbox
|
||||
name="persist"
|
||||
.label=${until(umbLocalizationContext.localize('user_rememberMe', undefined, 'Remember me'))}>
|
||||
<umb-localize key="user_rememberMe">Remember me</umb-localize>
|
||||
</uui-checkbox>
|
||||
</uui-form-layout-item>`
|
||||
)}
|
||||
${when(
|
||||
this.allowPasswordReset,
|
||||
() =>
|
||||
html`
|
||||
<button type="button" id="forgot-password" @click=${this.#handleForgottenPassword}>
|
||||
<umb-localize key="login_forgottenPassword">Forgotten password?</umb-localize>
|
||||
</button>`
|
||||
)}
|
||||
</div>
|
||||
<uui-button
|
||||
type="submit"
|
||||
id="umb-login-button"
|
||||
look="primary"
|
||||
@click=${this.#onSubmitClick}
|
||||
.label=${until(umbLocalizationContext.localize('general_login', undefined, 'Login'), 'Login')}
|
||||
color="default"
|
||||
.state=${this._loginState}></uui-button>
|
||||
|
||||
${this.#renderErrorMessage()}
|
||||
`}
|
||||
<umb-external-login-providers-layout .showDivider=${!this.disableLocalLogin}>
|
||||
<slot name="external"></slot>
|
||||
</umb-external-login-providers-layout>
|
||||
`;
|
||||
${this.#renderErrorMessage()}
|
||||
`}
|
||||
<umb-external-login-providers-layout .showDivider=${!this.disableLocalLogin}>
|
||||
<slot name="external"></slot>
|
||||
</umb-external-login-providers-layout>
|
||||
`;
|
||||
}
|
||||
|
||||
#renderErrorMessage() {
|
||||
@@ -158,7 +162,7 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
}
|
||||
|
||||
#handleForgottenPassword() {
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', { composed: true, detail: { flow: 'reset' } }));
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', {composed: true, detail: {flow: 'reset'}}));
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
@@ -168,11 +172,23 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#greeting {
|
||||
color: var(--uui-color-interactive);
|
||||
text-align: center;
|
||||
font-weight: 400;
|
||||
font-size: 1.5rem;
|
||||
font-size: var(--header-font-size);
|
||||
margin: 0 0 var(--uui-size-layout-1);
|
||||
line-height: 1.2;
|
||||
}
|
||||
@@ -180,8 +196,6 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
#umb-login-button {
|
||||
margin-top: var(--uui-size-space-4);
|
||||
width: 100%;
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
|
||||
#forgot-password {
|
||||
@@ -197,12 +211,18 @@ export default class UmbLoginPageElement extends LitElement {
|
||||
line-height: 1;
|
||||
font-size: 14px;
|
||||
font-family: var(--uui-font-family);
|
||||
margin-left: auto;
|
||||
margin-bottom: var(--uui-size-space-3);
|
||||
}
|
||||
|
||||
#forgot-password:hover {
|
||||
color: var(--uui-color-interactive-emphasis);
|
||||
}
|
||||
|
||||
.text-error {
|
||||
margin-top: var(--uui-size-space-4);
|
||||
}
|
||||
|
||||
.text-danger {
|
||||
color: var(--uui-color-danger-standalone);
|
||||
}
|
||||
|
||||
@@ -1,243 +1,285 @@
|
||||
import type { UUIButtonState, UUIInputElement } from '@umbraco-ui/uui';
|
||||
import { LitElement, css, html, nothing } from 'lit';
|
||||
import { customElement, state } from 'lit/decorators.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
import { umbAuthContext } from '../../context/auth.context.js';
|
||||
import { umbLocalizationContext } from '../../external/localization/localization-context.js';
|
||||
import { loadCustomView, renderCustomView } from '../../utils/load-custom-view.function.js';
|
||||
import type {UUIButtonState, UUIInputElement} from '@umbraco-ui/uui';
|
||||
import {LitElement, css, html, nothing} from 'lit';
|
||||
import {customElement, state} from 'lit/decorators.js';
|
||||
import {until} from 'lit/directives/until.js';
|
||||
import {umbAuthContext} from '../../context/auth.context.js';
|
||||
import {umbLocalizationContext} from '../../external/localization/localization-context.js';
|
||||
import {loadCustomView, renderCustomView} from '../../utils/load-custom-view.function.js';
|
||||
|
||||
type MfaCustomViewElement = HTMLElement & {
|
||||
providers?: string[];
|
||||
providers?: string[];
|
||||
returnPath?: string;
|
||||
};
|
||||
|
||||
@customElement('umb-mfa-page')
|
||||
export default class UmbMfaPageElement extends LitElement {
|
||||
@state()
|
||||
protected providers: Array<{ name: string; value: string; selected: boolean }> = [];
|
||||
@state()
|
||||
protected providers: Array<{ name: string; value: string; selected: boolean }> = [];
|
||||
|
||||
@state()
|
||||
private loading = true;
|
||||
@state()
|
||||
private loading = true;
|
||||
|
||||
@state()
|
||||
private buttonState?: UUIButtonState;
|
||||
@state()
|
||||
private buttonState?: UUIButtonState;
|
||||
|
||||
@state()
|
||||
private error: string | null = null;
|
||||
@state()
|
||||
private error: string | null = null;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
this.#loadProviders();
|
||||
}
|
||||
constructor() {
|
||||
super();
|
||||
this.#loadProviders();
|
||||
}
|
||||
|
||||
async #loadProviders() {
|
||||
try {
|
||||
const response = await umbAuthContext.getMfaProviders();
|
||||
this.providers = response.providers.map((provider) => ({ name: provider, value: provider, selected: false }));
|
||||
async #loadProviders() {
|
||||
try {
|
||||
const response = await umbAuthContext.getMfaProviders();
|
||||
this.providers = response.providers.map((provider) => ({name: provider, value: provider, selected: false}));
|
||||
|
||||
if (this.providers.length) {
|
||||
this.providers[0].selected = true;
|
||||
}
|
||||
if (this.providers.length) {
|
||||
this.providers[0].selected = true;
|
||||
}
|
||||
|
||||
if (response.error) {
|
||||
this.error = response.error;
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
this.error = e.message ?? 'Unknown error';
|
||||
} else {
|
||||
this.error = 'Unknown error';
|
||||
}
|
||||
this.providers = [];
|
||||
}
|
||||
this.loading = false;
|
||||
}
|
||||
if (response.error) {
|
||||
this.error = response.error;
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
this.error = e.message ?? 'Unknown error';
|
||||
} else {
|
||||
this.error = 'Unknown error';
|
||||
}
|
||||
this.providers = [];
|
||||
}
|
||||
this.loading = false;
|
||||
}
|
||||
|
||||
private async handleSubmit(e: SubmitEvent) {
|
||||
e.preventDefault();
|
||||
private async handleSubmit(e: SubmitEvent) {
|
||||
e.preventDefault();
|
||||
|
||||
this.error = null;
|
||||
this.error = null;
|
||||
|
||||
const form = e.target as HTMLFormElement;
|
||||
if (!form) return;
|
||||
const form = e.target as HTMLFormElement;
|
||||
if (!form) return;
|
||||
|
||||
const codeInput = form.elements.namedItem('2facode') as UUIInputElement;
|
||||
const codeInput = form.elements.namedItem('2facode') as UUIInputElement;
|
||||
|
||||
if (codeInput) {
|
||||
codeInput.error = false;
|
||||
codeInput.errorMessage = '';
|
||||
}
|
||||
if (codeInput) {
|
||||
codeInput.error = false;
|
||||
codeInput.errorMessage = '';
|
||||
}
|
||||
|
||||
if (!form.checkValidity()) return;
|
||||
if (!form.checkValidity()) return;
|
||||
|
||||
const formData = new FormData(form);
|
||||
const formData = new FormData(form);
|
||||
|
||||
let provider = formData.get('provider') as string;
|
||||
let provider = formData.get('provider') as string;
|
||||
|
||||
// If no provider given, use the first one (there probably is only one anyway)
|
||||
if (!provider) {
|
||||
provider = this.providers[0].value;
|
||||
}
|
||||
// If no provider given, use the first one (there probably is only one anyway)
|
||||
if (!provider) {
|
||||
provider = this.providers[0].value;
|
||||
}
|
||||
|
||||
if (!provider) {
|
||||
this.error = 'No provider selected';
|
||||
return;
|
||||
}
|
||||
if (!provider) {
|
||||
this.error = 'No provider selected';
|
||||
return;
|
||||
}
|
||||
|
||||
const code = formData.get('token') as string;
|
||||
const code = formData.get('token') as string;
|
||||
|
||||
this.buttonState = 'waiting';
|
||||
this.buttonState = 'waiting';
|
||||
|
||||
try {
|
||||
const response = await umbAuthContext.validateMfaCode(code, provider);
|
||||
if (response.error) {
|
||||
if (codeInput) {
|
||||
codeInput.error = true;
|
||||
codeInput.errorMessage = response.error;
|
||||
} else {
|
||||
this.error = response.error;
|
||||
}
|
||||
this.buttonState = 'failed';
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const response = await umbAuthContext.validateMfaCode(code, provider);
|
||||
if (response.error) {
|
||||
if (codeInput) {
|
||||
codeInput.error = true;
|
||||
codeInput.errorMessage = response.error;
|
||||
} else {
|
||||
this.error = response.error;
|
||||
}
|
||||
this.buttonState = 'failed';
|
||||
return;
|
||||
}
|
||||
|
||||
this.buttonState = 'success';
|
||||
this.buttonState = 'success';
|
||||
|
||||
const returnPath = umbAuthContext.returnPath;
|
||||
if (returnPath) {
|
||||
location.href = returnPath;
|
||||
}
|
||||
const returnPath = umbAuthContext.returnPath;
|
||||
if (returnPath) {
|
||||
location.href = returnPath;
|
||||
}
|
||||
|
||||
this.dispatchEvent(new CustomEvent('umb-login-success', { bubbles: true, composed: true, detail: response.data }));
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
this.error = e.message ?? 'Unknown error';
|
||||
} else {
|
||||
this.error = 'Unknown error';
|
||||
}
|
||||
this.buttonState = 'failed';
|
||||
this.dispatchEvent(new CustomEvent('umb-login-failed', { bubbles: true, composed: true, detail: e }));
|
||||
}
|
||||
}
|
||||
this.dispatchEvent(
|
||||
new CustomEvent('umb-login-success', {bubbles: true, composed: true, detail: response.data})
|
||||
);
|
||||
} catch (e) {
|
||||
if (e instanceof Error) {
|
||||
this.error = e.message ?? 'Unknown error';
|
||||
} else {
|
||||
this.error = 'Unknown error';
|
||||
}
|
||||
this.buttonState = 'failed';
|
||||
this.dispatchEvent(new CustomEvent('umb-login-failed', {bubbles: true, composed: true, detail: e}));
|
||||
}
|
||||
}
|
||||
|
||||
protected renderDefaultView() {
|
||||
return html`
|
||||
<uui-form>
|
||||
<form id="LoginForm" @submit=${this.handleSubmit}>
|
||||
<header>
|
||||
<h1>
|
||||
<umb-localize key="login_2faTitle">One last step</umb-localize>
|
||||
</h1>
|
||||
</header>
|
||||
protected renderDefaultView() {
|
||||
return html`
|
||||
<uui-form>
|
||||
<form id="LoginForm" @submit=${this.handleSubmit}>
|
||||
<header id="header">
|
||||
<h1>
|
||||
<umb-localize key="login_2faTitle">One last step</umb-localize>
|
||||
</h1>
|
||||
|
||||
<p>
|
||||
<umb-localize key="login_2faText">
|
||||
You have enabled 2-factor authentication and must verify your identity.
|
||||
</umb-localize>
|
||||
</p>
|
||||
<p>
|
||||
<umb-localize key="login_2faText">
|
||||
You have enabled 2-factor authentication and must verify your identity.
|
||||
</umb-localize>
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<!-- if there's only one provider active, it will skip this step! -->
|
||||
${this.providers.length > 1
|
||||
? html`
|
||||
<uui-form-layout-item label="@login_2faMultipleText">
|
||||
<uui-label id="providerLabel" for="provider" slot="label" required>
|
||||
<umb-localize key="login_2faMultipleText">Please choose a 2-factor provider</umb-localize>
|
||||
</uui-label>
|
||||
<uui-select id="provider" name="provider" .options=${this.providers} aria-required="true" required>
|
||||
</uui-select>
|
||||
</uui-form-layout-item>
|
||||
`
|
||||
: nothing}
|
||||
<!-- if there's only one provider active, it will skip this step! -->
|
||||
${this.providers.length > 1
|
||||
? html`
|
||||
<uui-form-layout-item label="@login_2faMultipleText">
|
||||
<uui-label id="providerLabel" for="provider" slot="label" required>
|
||||
<umb-localize key="login_2faMultipleText">Please choose a 2-factor provider</umb-localize>
|
||||
</uui-label>
|
||||
<div class="uui-input-wrapper">
|
||||
<uui-select id="provider" name="provider" .options=${this.providers} aria-required="true" required>
|
||||
</uui-select>
|
||||
</div>
|
||||
</uui-form-layout-item>
|
||||
`
|
||||
: nothing}
|
||||
|
||||
<uui-form-layout-item>
|
||||
<uui-label id="2facodeLabel" for="2facode" slot="label" required>
|
||||
<umb-localize key="login_2faCodeInput">Verification code</umb-localize>
|
||||
</uui-label>
|
||||
<uui-form-layout-item>
|
||||
<uui-label id="2facodeLabel" for="2facode" slot="label" required>
|
||||
<umb-localize key="login_2faCodeInput">Verification code</umb-localize>
|
||||
</uui-label>
|
||||
|
||||
<uui-input
|
||||
autofocus
|
||||
id="2facode"
|
||||
type="text"
|
||||
name="token"
|
||||
inputmode="numeric"
|
||||
autocomplete="one-time-code"
|
||||
placeholder=${until(
|
||||
umbLocalizationContext.localize('login_2faCodeInputHelp'),
|
||||
'Please enter the verification code'
|
||||
)}
|
||||
aria-required="true"
|
||||
required
|
||||
required-message=${until(
|
||||
umbLocalizationContext.localize('login_2faCodeInputHelp'),
|
||||
'Please enter the verification code'
|
||||
)}
|
||||
style="width:100%;">
|
||||
</uui-input>
|
||||
</uui-form-layout-item>
|
||||
<uui-input
|
||||
autofocus
|
||||
id="2facode"
|
||||
type="text"
|
||||
name="token"
|
||||
inputmode="numeric"
|
||||
autocomplete="one-time-code"
|
||||
placeholder=${until(
|
||||
umbLocalizationContext.localize('login_2faCodeInputHelp'),
|
||||
'Please enter the verification code'
|
||||
)}
|
||||
aria-required="true"
|
||||
required
|
||||
required-message=${until(
|
||||
umbLocalizationContext.localize('login_2faCodeInputHelp'),
|
||||
'Please enter the verification code'
|
||||
)}
|
||||
style="width:100%;">
|
||||
</uui-input>
|
||||
</uui-form-layout-item>
|
||||
|
||||
<div id="actions">
|
||||
<uui-button
|
||||
.state=${this.buttonState}
|
||||
button-style="success"
|
||||
look="primary"
|
||||
color="default"
|
||||
label=${until(umbLocalizationContext.localize('general_validate'), 'Validate')}
|
||||
type="submit"></uui-button>
|
||||
<uui-button
|
||||
label=${until(umbLocalizationContext.localize('general_back'), 'Back')}
|
||||
@click="${this.onGoBack}"></uui-button>
|
||||
</div>
|
||||
${this.error ? html` <span class="text-danger">${this.error}</span> ` : nothing}
|
||||
</form>
|
||||
</uui-form>
|
||||
`;
|
||||
}
|
||||
${this.error ? html` <span class="text-danger">${this.error}</span> ` : nothing}
|
||||
|
||||
protected async renderCustomView() {
|
||||
const view = umbAuthContext.twoFactorView;
|
||||
if (!view) return nothing;
|
||||
<uui-button
|
||||
.state=${this.buttonState}
|
||||
button-style="success"
|
||||
look="primary"
|
||||
color="default"
|
||||
label=${until(umbLocalizationContext.localize('general_validate'), 'Validate')}
|
||||
type="submit"></uui-button>
|
||||
</form>
|
||||
</uui-form>
|
||||
|
||||
try {
|
||||
const customView = await loadCustomView<MfaCustomViewElement>(view);
|
||||
if (typeof customView === 'object') {
|
||||
customView.providers = this.providers.map((provider) => provider.value);
|
||||
<umb-back-to-login-button style="margin-top: var(--uui-size-space-6)"></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
|
||||
protected async renderCustomView() {
|
||||
const view = umbAuthContext.twoFactorView;
|
||||
if (!view) return nothing;
|
||||
|
||||
try {
|
||||
const customView = await loadCustomView<MfaCustomViewElement>(view);
|
||||
if (typeof customView === 'object') {
|
||||
customView.providers = this.providers.map((provider) => provider.value);
|
||||
customView.returnPath = umbAuthContext.returnPath;
|
||||
}
|
||||
return renderCustomView(customView);
|
||||
} catch (e) {
|
||||
const error = e instanceof Error ? e.message : 'Unknown error';
|
||||
console.group('[MFA login] Failed to load custom view');
|
||||
console.log('Element reference', this);
|
||||
console.log('Custom view', view);
|
||||
console.error('Failed to load custom view:', e);
|
||||
console.groupEnd();
|
||||
return html`<span class="text-danger">${error}</span>`;
|
||||
}
|
||||
}
|
||||
}
|
||||
return renderCustomView(customView);
|
||||
} catch (e) {
|
||||
const error = e instanceof Error ? e.message : 'Unknown error';
|
||||
console.group('[MFA login] Failed to load custom view');
|
||||
console.log('Element reference', this);
|
||||
console.log('Custom view', view);
|
||||
console.error('Failed to load custom view:', e);
|
||||
console.groupEnd();
|
||||
return html`<span class="text-danger">${error}</span>`;
|
||||
}
|
||||
}
|
||||
|
||||
protected render() {
|
||||
return this.loading
|
||||
? html`<uui-loader-bar></uui-loader-bar>`
|
||||
: umbAuthContext.twoFactorView
|
||||
? until(this.renderCustomView(), html`<uui-loader-bar></uui-loader-bar>`)
|
||||
: this.renderDefaultView();
|
||||
}
|
||||
protected render() {
|
||||
return this.loading
|
||||
? html`
|
||||
<uui-loader-bar></uui-loader-bar>`
|
||||
: umbAuthContext.twoFactorView
|
||||
? until(this.renderCustomView(), html`
|
||||
<uui-loader-bar></uui-loader-bar>`)
|
||||
: this.renderDefaultView();
|
||||
}
|
||||
|
||||
private onGoBack() {
|
||||
this.dispatchEvent(new CustomEvent('umb-login-flow', { composed: true, detail: { flow: undefined } }));
|
||||
}
|
||||
static styles = [
|
||||
css`
|
||||
#header {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
static styles = [
|
||||
css`
|
||||
.text-danger {
|
||||
color: var(--uui-color-danger-standalone);
|
||||
}
|
||||
`,
|
||||
];
|
||||
#header h1 {
|
||||
font-weight: 400;
|
||||
font-size: var(--header-secondary-font-size);
|
||||
color: var(--uui-color-interactive);
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-2);
|
||||
}
|
||||
|
||||
.uui-input-wrapper {
|
||||
background-color: var(--uui-color-surface);
|
||||
}
|
||||
|
||||
uui-form-layout-item {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
uui-input,
|
||||
uui-input-password {
|
||||
width: 100%;
|
||||
height: var(--input-height);
|
||||
border-radius: var(--uui-border-radius);
|
||||
}
|
||||
|
||||
uui-input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
uui-button {
|
||||
width: 100%;
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
|
||||
.text-danger {
|
||||
color: var(--uui-color-danger-standalone);
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-mfa-page': UmbMfaPageElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-mfa-page': UmbMfaPageElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,87 +1,106 @@
|
||||
import type { UUIButtonState, UUIInputPasswordElement } from '@umbraco-ui/uui';
|
||||
import { LitElement, html, nothing } from 'lit';
|
||||
import { customElement, query, state } from 'lit/decorators.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
import type {UUIButtonState, UUIInputPasswordElement} from '@umbraco-ui/uui';
|
||||
import {LitElement, html} from 'lit';
|
||||
import {customElement, query, state} from 'lit/decorators.js';
|
||||
import {until} from 'lit/directives/until.js';
|
||||
|
||||
import { umbAuthContext } from '../../context/auth.context.js';
|
||||
import { umbLocalizationContext } from '../../external/localization/localization-context.js';
|
||||
import {umbAuthContext} from '../../context/auth.context.js';
|
||||
import {umbLocalizationContext} from '../../external/localization/localization-context.js';
|
||||
|
||||
@customElement('umb-new-password-page')
|
||||
export default class UmbNewPasswordPageElement extends LitElement {
|
||||
@query('#confirmPassword')
|
||||
confirmPasswordElement!: UUIInputPasswordElement;
|
||||
@query('#confirmPassword')
|
||||
confirmPasswordElement!: UUIInputPasswordElement;
|
||||
|
||||
@state()
|
||||
state: UUIButtonState = undefined;
|
||||
@state()
|
||||
state: UUIButtonState = undefined;
|
||||
|
||||
@state()
|
||||
page: 'new' | 'done' | 'error' = 'new';
|
||||
@state()
|
||||
page: 'new' | 'done' | 'error' = 'new';
|
||||
|
||||
@state()
|
||||
error = '';
|
||||
@state()
|
||||
error = '';
|
||||
|
||||
@state()
|
||||
userId: string | null = null;
|
||||
@state()
|
||||
userId: string | null = null;
|
||||
|
||||
@state()
|
||||
resetCode: string | null = null;
|
||||
@state()
|
||||
resetCode: string | null = null;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
this.resetCode = urlParams.get('resetCode');
|
||||
this.userId = urlParams.get('userId');
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
this.resetCode = urlParams.get('resetCode');
|
||||
this.userId = urlParams.get('userId');
|
||||
|
||||
if (!this.userId || !this.resetCode) {
|
||||
this.page = 'error';
|
||||
}
|
||||
}
|
||||
if (!this.userId || !this.resetCode) {
|
||||
this.page = 'error';
|
||||
}
|
||||
}
|
||||
|
||||
async #onSubmit(event: CustomEvent) {
|
||||
event.preventDefault();
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const resetCode = urlParams.get('resetCode');
|
||||
const userId = urlParams.get('userId');
|
||||
const password = event.detail.password;
|
||||
async #onSubmit(event: CustomEvent) {
|
||||
event.preventDefault();
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const resetCode = urlParams.get('resetCode');
|
||||
const userId = urlParams.get('userId');
|
||||
const password = event.detail.password;
|
||||
|
||||
if (!resetCode || !userId) return;
|
||||
if (!resetCode || !userId) return;
|
||||
|
||||
this.state = 'waiting';
|
||||
const response = await umbAuthContext.newPassword(password, resetCode, userId);
|
||||
this.state = response.status === 200 ? 'success' : 'failed';
|
||||
this.page = response.status === 200 ? 'done' : 'new';
|
||||
this.error = response.error || '';
|
||||
}
|
||||
this.state = 'waiting';
|
||||
const response = await umbAuthContext.newPassword(password, resetCode, userId);
|
||||
this.state = response.status === 200 ? 'success' : 'failed';
|
||||
this.page = response.status === 200 ? 'done' : 'new';
|
||||
this.error = response.error || '';
|
||||
}
|
||||
|
||||
#renderRoutes() {
|
||||
switch (this.page) {
|
||||
case 'new':
|
||||
return html`<umb-new-password-layout
|
||||
@submit=${this.#onSubmit}
|
||||
.userId=${this.userId!}
|
||||
.state=${this.state}
|
||||
.error=${this.error}></umb-new-password-layout>`;
|
||||
case 'error':
|
||||
return html`<umb-error-layout
|
||||
header=${until(umbLocalizationContext.localize('general_error', undefined, 'Error'))}
|
||||
message=${until(umbLocalizationContext.localize('errors_defaultError', undefined, 'An unknown failure has occured'))}>
|
||||
</umb-error-layout>`;
|
||||
case 'done':
|
||||
return html`<umb-confirmation-layout
|
||||
header=${until(umbLocalizationContext.localize('general_success', undefined, 'Success'))}
|
||||
message=${until(umbLocalizationContext.localize('login_setPasswordConfirmation', undefined, 'Your new password has been set and you may now use it to log in.'))}>
|
||||
</umb-confirmation-layout>`;
|
||||
}
|
||||
}
|
||||
#renderRoutes() {
|
||||
switch (this.page) {
|
||||
case 'new':
|
||||
return html`
|
||||
<umb-new-password-layout
|
||||
@submit=${this.#onSubmit}
|
||||
.userId=${this.userId!}
|
||||
.state=${this.state}
|
||||
.error=${this.error}></umb-new-password-layout>`;
|
||||
case 'error':
|
||||
return html`
|
||||
<umb-error-layout
|
||||
header=${until(umbLocalizationContext.localize('general_error', undefined, 'Error'))}
|
||||
message=${until(
|
||||
umbLocalizationContext.localize('errors_defaultError', undefined, 'An unknown failure has occured')
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
case 'done':
|
||||
return html`
|
||||
<umb-confirmation-layout
|
||||
header=${until(umbLocalizationContext.localize('general_success', undefined, 'Success'))}
|
||||
message=${until(
|
||||
umbLocalizationContext.localize(
|
||||
'login_setPasswordConfirmation',
|
||||
undefined,
|
||||
'Your new password has been set and you may now use it to log in.'
|
||||
)
|
||||
)}>
|
||||
</umb-confirmation-layout>`;
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
return this.userId && this.resetCode ? this.#renderRoutes() : nothing;
|
||||
}
|
||||
render() {
|
||||
return this.userId && this.resetCode
|
||||
? this.#renderRoutes()
|
||||
: html`
|
||||
<umb-error-layout
|
||||
header=${until(umbLocalizationContext.localize('general_error', undefined, 'Error'))}
|
||||
message=${until(
|
||||
umbLocalizationContext.localize('errors_defaultError', undefined, 'An unknown failure has occured')
|
||||
)}>
|
||||
</umb-error-layout>`;
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-new-password-page': UmbNewPasswordPageElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-new-password-page': UmbNewPasswordPageElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,155 +1,176 @@
|
||||
import type { UUIButtonState } from '@umbraco-ui/uui';
|
||||
import { CSSResultGroup, LitElement, css, html, nothing } from 'lit';
|
||||
import { customElement, state } from 'lit/decorators.js';
|
||||
import { until } from 'lit/directives/until.js';
|
||||
import type {UUIButtonState} from '@umbraco-ui/uui';
|
||||
import {CSSResultGroup, LitElement, css, html, nothing} from 'lit';
|
||||
import {customElement, state} from 'lit/decorators.js';
|
||||
import {until} from 'lit/directives/until.js';
|
||||
|
||||
import { umbAuthContext } from '../../context/auth.context.js';
|
||||
import { umbLocalizationContext } from '../../external/localization/localization-context.js';
|
||||
import {umbAuthContext} from '../../context/auth.context.js';
|
||||
import {umbLocalizationContext} from '../../external/localization/localization-context.js';
|
||||
|
||||
@customElement('umb-reset-password-page')
|
||||
export default class UmbResetPasswordPageElement extends LitElement {
|
||||
@state()
|
||||
resetCallState: UUIButtonState = undefined;
|
||||
@state()
|
||||
resetCallState: UUIButtonState = undefined;
|
||||
|
||||
@state()
|
||||
error = '';
|
||||
@state()
|
||||
error = '';
|
||||
|
||||
#handleResetSubmit = async (e: SubmitEvent) => {
|
||||
e.preventDefault();
|
||||
const form = e.target as HTMLFormElement;
|
||||
#handleResetSubmit = async (e: SubmitEvent) => {
|
||||
e.preventDefault();
|
||||
const form = e.target as HTMLFormElement;
|
||||
|
||||
if (!form) return;
|
||||
if (!form.checkValidity()) return;
|
||||
if (!form) return;
|
||||
if (!form.checkValidity()) return;
|
||||
|
||||
const formData = new FormData(form);
|
||||
const username = formData.get('email') as string;
|
||||
const formData = new FormData(form);
|
||||
const username = formData.get('email') as string;
|
||||
|
||||
this.resetCallState = 'waiting';
|
||||
const response = await umbAuthContext.resetPassword(username);
|
||||
this.resetCallState = response.status === 200 ? 'success' : 'failed';
|
||||
this.error = response.error || '';
|
||||
};
|
||||
this.resetCallState = 'waiting';
|
||||
const response = await umbAuthContext.resetPassword(username);
|
||||
this.resetCallState = response.status === 200 ? 'success' : 'failed';
|
||||
this.error = response.error || '';
|
||||
};
|
||||
|
||||
#renderResetPage() {
|
||||
return html`
|
||||
<uui-form>
|
||||
<form id="LoginForm" name="login" @submit="${this.#handleResetSubmit}">
|
||||
<div id="header">
|
||||
<h2>
|
||||
<umb-localize key="login_forgottenPassword">Forgotten password?</umb-localize>
|
||||
</h2>
|
||||
<span>
|
||||
<umb-localize key="login_forgottenPasswordInstruction">An email will be sent to the address specified with a link to reset your password</umb-localize>
|
||||
#renderResetPage() {
|
||||
return html`
|
||||
<uui-form>
|
||||
<form id="LoginForm" name="login" @submit="${this.#handleResetSubmit}">
|
||||
<header id="header">
|
||||
<h1>
|
||||
<umb-localize key="login_forgottenPassword">Forgotten password?</umb-localize>
|
||||
</h1>
|
||||
<span>
|
||||
<umb-localize key="login_forgottenPasswordInstruction"
|
||||
>An email will be sent to the address specified with a link to reset your password</umb-localize
|
||||
>
|
||||
</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<uui-form-layout-item>
|
||||
<uui-label for="email" slot="label" required>
|
||||
<umb-localize key="general_email">Email</umb-localize>
|
||||
</uui-label>
|
||||
<uui-input
|
||||
type="email"
|
||||
id="email"
|
||||
name="email"
|
||||
.label=${until(umbLocalizationContext.localize('general_email', undefined, 'Email'))}
|
||||
required
|
||||
required-message=${until(umbLocalizationContext.localize('general_required', undefined, 'Email'))}></uui-input>
|
||||
</uui-form-layout-item>
|
||||
<uui-form-layout-item>
|
||||
<uui-label for="email" slot="label" required>
|
||||
<umb-localize key="general_email">Email</umb-localize>
|
||||
</uui-label>
|
||||
<uui-input
|
||||
type="email"
|
||||
id="email"
|
||||
name="email"
|
||||
.label=${until(umbLocalizationContext.localize('general_email', undefined, 'Email'))}
|
||||
required
|
||||
required-message=${until(
|
||||
umbLocalizationContext.localize('general_required', undefined, 'Required')
|
||||
)}></uui-input>
|
||||
</uui-form-layout-item>
|
||||
|
||||
${this.#renderErrorMessage()}
|
||||
${this.#renderErrorMessage()}
|
||||
|
||||
<uui-button
|
||||
type="submit"
|
||||
.label=${until(umbLocalizationContext.localize('general_submit', undefined, 'Submit'))}
|
||||
look="primary"
|
||||
color="default"
|
||||
.state=${this.resetCallState}></uui-button>
|
||||
</form>
|
||||
</uui-form>
|
||||
<uui-button
|
||||
type="submit"
|
||||
.label=${until(umbLocalizationContext.localize('general_submit', undefined, 'Submit'))}
|
||||
look="primary"
|
||||
color="default"
|
||||
.state=${this.resetCallState}></uui-button>
|
||||
</form>
|
||||
</uui-form>
|
||||
|
||||
<umb-back-to-login-button style="margin-top: var(--uui-size-space-6)"></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
<umb-back-to-login-button style="margin-top: var(--uui-size-space-6)"></umb-back-to-login-button>
|
||||
`;
|
||||
}
|
||||
|
||||
#renderErrorMessage() {
|
||||
if (!this.error || this.resetCallState !== 'failed') return nothing;
|
||||
#renderErrorMessage() {
|
||||
if (!this.error || this.resetCallState !== 'failed') return nothing;
|
||||
|
||||
return html`<span class="text-danger">${this.error}</span>`;
|
||||
}
|
||||
return html`<span class="text-danger">${this.error}</span>`;
|
||||
}
|
||||
|
||||
#renderConfirmationPage() {
|
||||
return html`
|
||||
<umb-confirmation-layout
|
||||
header=${until(umbLocalizationContext.localize('login_forgottenPassword', undefined, 'Forgotten password?'))}
|
||||
message=${until(umbLocalizationContext.localize('login_requestPasswordResetConfirmation', undefined, 'An email with password reset instructions will be sent to the specified address if it matched our records'))}>
|
||||
</umb-confirmation-layout>
|
||||
`;
|
||||
}
|
||||
#renderConfirmationPage() {
|
||||
return html`
|
||||
<umb-confirmation-layout
|
||||
header=${until(umbLocalizationContext.localize('login_forgottenPassword', undefined, 'Forgotten password?'))}
|
||||
message=${until(
|
||||
umbLocalizationContext.localize(
|
||||
'login_requestPasswordResetConfirmation',
|
||||
undefined,
|
||||
'An email with password reset instructions will be sent to the specified address if it matched our records'
|
||||
)
|
||||
)}>
|
||||
</umb-confirmation-layout>
|
||||
`;
|
||||
}
|
||||
|
||||
render() {
|
||||
return this.resetCallState === 'success' ? this.#renderConfirmationPage() : this.#renderResetPage();
|
||||
}
|
||||
render() {
|
||||
return this.resetCallState === 'success' ? this.#renderConfirmationPage() : this.#renderResetPage();
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
#header h2 {
|
||||
margin: 0px;
|
||||
font-weight: bold;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-2);
|
||||
}
|
||||
uui-form-layout-item {
|
||||
margin: 0;
|
||||
}
|
||||
uui-input,
|
||||
uui-input-password {
|
||||
width: 100%;
|
||||
border-radius: var(--uui-border-radius);
|
||||
}
|
||||
uui-input {
|
||||
width: 100%;
|
||||
}
|
||||
uui-button {
|
||||
width: 100%;
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
static styles: CSSResultGroup = [
|
||||
css`
|
||||
#header {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-space-5);
|
||||
}
|
||||
|
||||
#resend {
|
||||
display: inline-flex;
|
||||
font-size: 14px;
|
||||
align-self: center;
|
||||
gap: var(--uui-size-space-1);
|
||||
}
|
||||
#header span {
|
||||
color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#resend a {
|
||||
color: var(--uui-color-selected);
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
}
|
||||
#resend a:hover {
|
||||
color: var(--uui-color-interactive-emphasis);
|
||||
}
|
||||
`,
|
||||
];
|
||||
#header h1 {
|
||||
margin: 0;
|
||||
font-weight: 400;
|
||||
font-size: var(--header-secondary-font-size);
|
||||
color: var(--uui-color-interactive);
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--uui-size-layout-2);
|
||||
}
|
||||
|
||||
uui-form-layout-item {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
uui-input,
|
||||
uui-input-password {
|
||||
width: 100%;
|
||||
height: var(--input-height);
|
||||
border-radius: var(--uui-border-radius);
|
||||
}
|
||||
|
||||
uui-input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
uui-button {
|
||||
width: 100%;
|
||||
--uui-button-padding-top-factor: 1.5;
|
||||
--uui-button-padding-bottom-factor: 1.5;
|
||||
}
|
||||
|
||||
#resend {
|
||||
display: inline-flex;
|
||||
font-size: 14px;
|
||||
align-self: center;
|
||||
gap: var(--uui-size-space-1);
|
||||
}
|
||||
|
||||
#resend a {
|
||||
color: var(--uui-color-selected);
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#resend a:hover {
|
||||
color: var(--uui-color-interactive-emphasis);
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-reset-password-page': UmbResetPasswordPageElement;
|
||||
}
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-reset-password-page': UmbResetPasswordPageElement;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import {
|
||||
LoginRequestModel,
|
||||
IUmbAuthContext,
|
||||
LoginResponse,
|
||||
ResetPasswordResponse,
|
||||
ValidatePasswordResetCodeResponse,
|
||||
NewPasswordResponse,
|
||||
MfaProvidersResponse,
|
||||
LoginRequestModel,
|
||||
IUmbAuthContext,
|
||||
LoginResponse,
|
||||
ResetPasswordResponse,
|
||||
ValidatePasswordResetCodeResponse,
|
||||
NewPasswordResponse,
|
||||
MfaProvidersResponse,
|
||||
} from '../types.js';
|
||||
import { UmbAuthRepository } from './auth.repository.js';
|
||||
import {UmbAuthRepository} from './auth.repository.js';
|
||||
|
||||
export class UmbAuthContext implements IUmbAuthContext {
|
||||
readonly supportsPersistLogin = false;
|
||||
disableLocalLogin = false;
|
||||
readonly supportsPersistLogin = false;
|
||||
disableLocalLogin = false;
|
||||
|
||||
#authRepository = new UmbAuthRepository();
|
||||
#authRepository = new UmbAuthRepository();
|
||||
|
||||
#returnPath = '';
|
||||
#returnPath = '';
|
||||
|
||||
set returnPath(value: string) {
|
||||
this.#returnPath = value;
|
||||
@@ -30,52 +30,65 @@ export class UmbAuthContext implements IUmbAuthContext {
|
||||
*/
|
||||
get returnPath(): string {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
let returnUrl = params.get('ReturnUrl') ?? params.get('returnPath') ?? this.#returnPath;
|
||||
let returnPath = params.get('ReturnUrl') ?? params.get('returnPath') ?? this.#returnPath;
|
||||
|
||||
// Paths from the old Backoffice are encoded twice and need to be decoded,
|
||||
// but we don't want to decode the new paths coming from the Management API.
|
||||
if (returnUrl.indexOf('/security/back-office/authorize') === -1) {
|
||||
returnUrl = decodeURIComponent(returnUrl);
|
||||
if (returnPath.indexOf('/security/back-office/authorize') === -1) {
|
||||
returnPath = decodeURIComponent(returnPath);
|
||||
}
|
||||
return returnUrl || '';
|
||||
|
||||
// If return path is empty, return an empty string.
|
||||
if (!returnPath) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// Safely check that the return path is valid and doesn't link to an external site.
|
||||
const url = new URL(returnPath, window.location.origin);
|
||||
|
||||
if (url.origin !== window.location.origin) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
async login(data: LoginRequestModel): Promise<LoginResponse> {
|
||||
return this.#authRepository.login(data);
|
||||
}
|
||||
async login(data: LoginRequestModel): Promise<LoginResponse> {
|
||||
return this.#authRepository.login(data);
|
||||
}
|
||||
|
||||
async resetPassword(username: string): Promise<ResetPasswordResponse> {
|
||||
return this.#authRepository.resetPassword(username);
|
||||
}
|
||||
async resetPassword(username: string): Promise<ResetPasswordResponse> {
|
||||
return this.#authRepository.resetPassword(username);
|
||||
}
|
||||
|
||||
async validatePasswordResetCode(userId: string, resetCode: string): Promise<ValidatePasswordResetCodeResponse> {
|
||||
return this.#authRepository.validatePasswordResetCode(userId, resetCode);
|
||||
}
|
||||
async validatePasswordResetCode(userId: string, resetCode: string): Promise<ValidatePasswordResetCodeResponse> {
|
||||
return this.#authRepository.validatePasswordResetCode(userId, resetCode);
|
||||
}
|
||||
|
||||
async newPassword(password: string, resetCode: string, userId: string): Promise<NewPasswordResponse> {
|
||||
const userIdAsNumber = Number.parseInt(userId);
|
||||
return this.#authRepository.newPassword(password, resetCode, userIdAsNumber);
|
||||
}
|
||||
async newPassword(password: string, resetCode: string, userId: string): Promise<NewPasswordResponse> {
|
||||
const userIdAsNumber = Number.parseInt(userId);
|
||||
return this.#authRepository.newPassword(password, resetCode, userIdAsNumber);
|
||||
}
|
||||
|
||||
async newInvitedUserPassword(password: string): Promise<NewPasswordResponse> {
|
||||
return this.#authRepository.newInvitedUserPassword(password);
|
||||
}
|
||||
async newInvitedUserPassword(password: string): Promise<NewPasswordResponse> {
|
||||
return this.#authRepository.newInvitedUserPassword(password);
|
||||
}
|
||||
|
||||
async getPasswordConfig(userId: string): Promise<any> {
|
||||
return this.#authRepository.getPasswordConfig(userId);
|
||||
}
|
||||
async getPasswordConfig(userId: string): Promise<any> {
|
||||
return this.#authRepository.getPasswordConfig(userId);
|
||||
}
|
||||
|
||||
async getInvitedUser(): Promise<any> {
|
||||
return this.#authRepository.getInvitedUser();
|
||||
}
|
||||
async getInvitedUser(): Promise<any> {
|
||||
return this.#authRepository.getInvitedUser();
|
||||
}
|
||||
|
||||
getMfaProviders(): Promise<MfaProvidersResponse> {
|
||||
return this.#authRepository.getMfaProviders();
|
||||
}
|
||||
getMfaProviders(): Promise<MfaProvidersResponse> {
|
||||
return this.#authRepository.getMfaProviders();
|
||||
}
|
||||
|
||||
validateMfaCode(code: string, provider: string): Promise<LoginResponse> {
|
||||
return this.#authRepository.validateMfaCode(code, provider);
|
||||
}
|
||||
validateMfaCode(code: string, provider: string): Promise<LoginResponse> {
|
||||
return this.#authRepository.validateMfaCode(code, provider);
|
||||
}
|
||||
}
|
||||
|
||||
export const umbAuthContext = new UmbAuthContext() as IUmbAuthContext;
|
||||
|
||||
@@ -8,7 +8,7 @@ import type {
|
||||
import { umbLocalizationContext } from '../external/localization/localization-context.js';
|
||||
|
||||
export class UmbAuthRepository {
|
||||
readonly #authURL = 'backoffice/umbracoapi/authentication/postlogin';
|
||||
readonly #authURL = 'backoffice/umbracoapi/authentication/postlogin';
|
||||
|
||||
public async login(data: LoginRequestModel): Promise<LoginResponse> {
|
||||
try {
|
||||
@@ -26,7 +26,7 @@ export class UmbAuthRepository {
|
||||
const response = await fetch(request);
|
||||
|
||||
const responseData: LoginResponse = {
|
||||
status: response.status
|
||||
status: response.status,
|
||||
};
|
||||
|
||||
if (!response.ok) {
|
||||
@@ -39,7 +39,8 @@ export class UmbAuthRepository {
|
||||
if (text) {
|
||||
responseData.data = JSON.parse(this.#removeAngularJSResponseData(text));
|
||||
}
|
||||
} catch {}
|
||||
} catch {
|
||||
}
|
||||
|
||||
return {
|
||||
status: response.status,
|
||||
@@ -249,16 +250,35 @@ export class UmbAuthRepository {
|
||||
switch (response.status) {
|
||||
case 400:
|
||||
case 401:
|
||||
return umbLocalizationContext.localize('login_userFailedLogin', undefined, "Oops! We couldn't log you in. Please check your credentials and try again.");
|
||||
return umbLocalizationContext.localize(
|
||||
'login_userFailedLogin',
|
||||
undefined,
|
||||
"Oops! We couldn't log you in. Please check your credentials and try again."
|
||||
);
|
||||
|
||||
case 402:
|
||||
return umbLocalizationContext.localize('login_2faText', undefined, 'You have enabled 2-factor authentication and must verify your identity.');
|
||||
return umbLocalizationContext.localize(
|
||||
'login_2faText',
|
||||
undefined,
|
||||
'You have enabled 2-factor authentication and must verify your identity.'
|
||||
);
|
||||
|
||||
case 500:
|
||||
return umbLocalizationContext.localize('errors_receivedErrorFromServer', undefined, 'Received error from server');
|
||||
return umbLocalizationContext.localize(
|
||||
'errors_receivedErrorFromServer',
|
||||
undefined,
|
||||
'Received error from server'
|
||||
);
|
||||
|
||||
default:
|
||||
return response.statusText ?? await umbLocalizationContext.localize('errors_receivedErrorFromServer', undefined, 'Received error from server')
|
||||
return (
|
||||
response.statusText ??
|
||||
(await umbLocalizationContext.localize(
|
||||
'errors_receivedErrorFromServer',
|
||||
undefined,
|
||||
'Received error from server'
|
||||
))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,30 +6,32 @@ import {loadCustomView, renderCustomView} from "../utils/load-custom-view.functi
|
||||
@customElement('umb-custom-view')
|
||||
export default class UmbCustomViewElement extends LitElement {
|
||||
@property({ attribute: 'custom-view' })
|
||||
customView?: string;
|
||||
set customView (value: string) {
|
||||
this.#customView = value;
|
||||
this.#loadView();
|
||||
}
|
||||
|
||||
@property({ attribute: 'args' })
|
||||
args?: any;
|
||||
@property({ type: Object, attribute: 'args'})
|
||||
set args (value: any) {
|
||||
this.#args = value;
|
||||
this.#loadView();
|
||||
}
|
||||
|
||||
@state()
|
||||
protected component: any = null;
|
||||
|
||||
attributeChangedCallback(name: string, _old: string | null, value: string | null) {
|
||||
super.attributeChangedCallback(name, _old, value);
|
||||
if (name === 'custom-view') {
|
||||
this.#loadView();
|
||||
}
|
||||
}
|
||||
#args?: any;
|
||||
#customView?: string;
|
||||
|
||||
async #loadView() {
|
||||
if (!this.customView || !this.customView.endsWith('.js') && !this.customView.endsWith('.html')) {
|
||||
if (!this.#customView || !this.#customView.endsWith('.js') && !this.#customView.endsWith('.html')) {
|
||||
return;
|
||||
}
|
||||
|
||||
const customView = await loadCustomView(this.customView);
|
||||
const customView = await loadCustomView(this.#customView);
|
||||
|
||||
if (this.args) {
|
||||
Object.entries(this.args).forEach(([key, value]) => {
|
||||
if (this.#args) {
|
||||
Object.entries(this.#args).forEach(([key, value]) => {
|
||||
(customView as any)[key] = value;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ template.innerHTML = `
|
||||
<div>
|
||||
<uui-button id="button" look="primary" label="My custom button">
|
||||
<uui-icon name="favorite"></uui-icon>
|
||||
My Custom button (<span id="providerName"></span>)
|
||||
My Custom button (<span id="providerName"></span> / <span id="userViewState"></span>)
|
||||
</uui-button>
|
||||
</div>
|
||||
`;
|
||||
@@ -16,6 +16,7 @@ template.innerHTML = `
|
||||
export class MyCustomView extends HTMLElement {
|
||||
providerName = '';
|
||||
displayName = '';
|
||||
userViewState = '';
|
||||
constructor() {
|
||||
super();
|
||||
this.attachShadow({ mode: 'open' });
|
||||
@@ -29,6 +30,7 @@ export class MyCustomView extends HTMLElement {
|
||||
connectedCallback() {
|
||||
console.log('My custom view connected');
|
||||
this.shadowRoot.getElementById('providerName').innerText = this.providerName;
|
||||
this.shadowRoot.getElementById('userViewState').innerText = this.userViewState;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,39 @@
|
||||
{
|
||||
"general": {
|
||||
"login": "Login"
|
||||
},
|
||||
"user": {
|
||||
"username": "Username",
|
||||
"email": "Email",
|
||||
"password": "Password"
|
||||
},
|
||||
"placeholders": {
|
||||
"username": "Enter your username",
|
||||
"email": "Enter your email",
|
||||
"password": "Enter your password"
|
||||
}
|
||||
"general": {
|
||||
"login": "Login",
|
||||
"email": "Email",
|
||||
"username": "Username",
|
||||
"password": "Password",
|
||||
"welcome": "Welcome",
|
||||
"or": "Or",
|
||||
"validate": "Validate",
|
||||
"back": "Back",
|
||||
"required": "Required",
|
||||
"continue": "Continue"
|
||||
},
|
||||
"login": {
|
||||
"greeting0": "Welcome",
|
||||
"greeting1": "Welcome",
|
||||
"greeting2": "Welcome",
|
||||
"greeting3": "Welcome",
|
||||
"greeting4": "Welcome",
|
||||
"greeting5": "Welcome",
|
||||
"greeting6": "Welcome",
|
||||
"forgottenPassword": "Forgotten password?",
|
||||
"signInWith": "Sign in with",
|
||||
"forgottenPasswordInstruction": "Enter your email address and we'll send you a link to reset your password.",
|
||||
"returnToLogin": "Return to login",
|
||||
"2faTitle": "Two-factor authentication",
|
||||
"2faText": "Enter the code from your authenticator app",
|
||||
"2faMultipleText": "Select an authentication method",
|
||||
"2faCodeInput": "Enter your code",
|
||||
"2faCodeInputHelp": "Enter the code from your authenticator app"
|
||||
},
|
||||
"user": {
|
||||
"username": "Username",
|
||||
"email": "Email",
|
||||
"password": "Password",
|
||||
"newPassword": "New password",
|
||||
"confirmNewPassword": "Confirm password"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,8 +38,9 @@ export const handlers = [
|
||||
rest.post('backoffice/umbracoapi/authentication/PostVerify2faCode', async (req, res, ctx) => {
|
||||
const body = await req.json();
|
||||
if (body.code === 'fail') {
|
||||
return res(ctx.delay(), ctx.status(400), ctx.json({ message: 'Invalid code' }));
|
||||
return res(ctx.delay(), ctx.status(400), ctx.json({ Message: 'Invalid code' }));
|
||||
}
|
||||
return res(ctx.delay(), ctx.status(200));
|
||||
const user = umbLoginData.users[0];
|
||||
return res(ctx.delay(), ctx.status(200), ctx.json(user));
|
||||
}),
|
||||
];
|
||||
|
||||