{"version":3,"file":"login.js","sources":["../../../../Umbraco.Web.UI.Login/src/contexts/auth.repository.ts","../../../../Umbraco.Web.UI.Login/src/contexts/auth.context.ts","../../../../Umbraco.Web.UI.Login/src/controllers/slim-backoffice-initializer.ts","../../../../Umbraco.Web.UI.Login/src/umbraco-package.ts","../../../../Umbraco.Web.UI.Login/src/auth.element.ts","../../../../Umbraco.Web.UI.Login/src/components/layouts/auth-layout.element.ts","../../../../Umbraco.Web.UI.Login/src/components/layouts/confirmation-layout.element.ts","../../../../Umbraco.Web.UI.Login/src/components/layouts/error-layout.element.ts","../../../../Umbraco.Web.UI.Login/src/components/layouts/new-password-layout.element.ts","../../../../Umbraco.Web.UI.Login/src/components/pages/invite.page.element.ts","../../../../Umbraco.Web.UI.Login/src/components/pages/login.page.element.ts","../../../../Umbraco.Web.UI.Login/src/utils/load-custom-view.function.ts","../../../../Umbraco.Web.UI.Login/src/components/pages/mfa.page.element.ts","../../../../Umbraco.Web.UI.Login/src/components/pages/new-password.page.element.ts","../../../../Umbraco.Web.UI.Login/src/components/pages/reset-password.page.element.ts","../../../../Umbraco.Web.UI.Login/src/components/back-to-login-button.element.ts"],"sourcesContent":["import {\n LoginRequestModel,\n LoginResponse, MfaCodeResponse,\n NewPasswordResponse,\n PasswordConfigurationModel,\n ResetPasswordResponse,\n ValidateInviteCodeResponse,\n ValidatePasswordResetCodeResponse\n} from \"../types.js\";\nimport { UmbRepositoryBase } from \"@umbraco-cms/backoffice/repository\";\nimport { UmbLocalizationController } from \"@umbraco-cms/backoffice/localization-api\";\nimport {\n ApiError,\n CancelError,\n ProblemDetails,\n SecurityService,\n UserService\n} from \"@umbraco-cms/backoffice/external/backend-api\";\nimport { tryExecute } from \"@umbraco-cms/backoffice/resources\";\n\nexport class UmbAuthRepository extends UmbRepositoryBase {\n #localize = new UmbLocalizationController(this);\n\n public async login(data: LoginRequestModel): Promise {\n try {\n const request = new Request('management/api/v1/security/back-office/login', {\n method: 'POST',\n body: JSON.stringify({\n username: data.username,\n password: data.password,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n const response = await fetch(request);\n\n if (!response.ok) {\n // If the response code is 402, it means that the user has enabled 2-factor authentication\n if (response.status === 402) {\n const responseData = await response.json();\n return {\n status: response.status,\n twoFactorView: responseData.twoFactorLoginView ?? '',\n twoFactorProviders: responseData.enabledTwoFactorProviderNames ?? [],\n };\n }\n\n return {\n status: response.status,\n error: await this.#getErrorText(response),\n };\n }\n\n return {\n status: response.status,\n data: {\n username: data.username,\n },\n };\n } catch (error) {\n return {\n status: 500,\n error: error instanceof Error ? error.message : this.#localize.term('auth_receivedErrorFromServer'),\n };\n }\n }\n\n public async validateMfaCode(code: string, provider: string): Promise {\n try {\n const requestData = new Request('management/api/v1/security/back-office/verify-2fa', {\n method: 'POST',\n body: JSON.stringify({\n code,\n provider,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n const response = await fetch(requestData);\n\n if (!response.ok) {\n return {\n error: response.status === 400 ? this.#localize.term('auth_mfaInvalidCode') : await this.#getErrorText(response),\n };\n }\n\n return {};\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : this.#localize.term('auth_receivedErrorFromServer'),\n };\n }\n }\n\n public async resetPassword(email: string): Promise {\n const response = await tryExecute(SecurityService.postSecurityForgotPassword({\n requestBody: {\n email\n }\n }))\n\n if (response.error) {\n return {\n error: this.#getApiErrorDetailText(response.error, 'Could not reset the password'),\n };\n }\n\n return {};\n }\n\n public async validatePasswordResetCode(userId: string, resetCode: string): Promise {\n const { data, error } = await tryExecute(SecurityService.postSecurityForgotPasswordVerify({\n requestBody: {\n user: {\n id: userId\n },\n resetCode\n }\n }));\n\n if (error || !data) {\n return {\n error: this.#getApiErrorDetailText(error, 'Could not validate the password reset code')\n };\n }\n\n return {\n passwordConfiguration: (data as unknown as {passwordConfiguration: PasswordConfigurationModel}).passwordConfiguration // TODO: Fix this when the API schema has been updated\n };\n }\n\n public async newPassword(password: string, resetCode: string, userId: string): Promise {\n const response = await tryExecute(SecurityService.postSecurityForgotPasswordReset({\n requestBody: {\n password,\n resetCode,\n user: {\n id: userId\n }\n }\n }));\n\n if (response.error) {\n return {\n error: this.#getApiErrorDetailText(response.error, 'Could not reset the password'),\n };\n }\n\n return {};\n }\n\n public async validateInviteCode(token: string, userId: string): Promise {\n const { data, error } = await tryExecute(UserService.postUserInviteVerify({\n requestBody: {\n token,\n user: {\n id: userId\n }\n }\n }));\n\n if (error || !data) {\n return {\n error: this.#getApiErrorDetailText(error, 'Could not validate the invite code')\n };\n }\n\n return {\n passwordConfiguration: (data as unknown as {passwordConfiguration: PasswordConfigurationModel}).passwordConfiguration // TODO: Fix this when the API schema has been updated\n };\n }\n\n public async newInvitedUserPassword(password: string, token: string, userId: string): Promise {\n const response = await tryExecute(UserService.postUserInviteCreatePassword({\n requestBody: {\n password,\n token,\n user: {\n id: userId\n }\n }\n }));\n\n if (response.error) {\n return {\n error: this.#getApiErrorDetailText(response.error, 'Could not create a password for the invited user')\n };\n }\n\n return {};\n }\n\n #getApiErrorDetailText(error: ApiError | CancelError | undefined, fallbackText?: string): string | undefined {\n if (error instanceof ApiError) {\n // Try to parse the body\n return typeof error.body === 'object' ? (error.body as ProblemDetails).title ?? fallbackText : fallbackText ?? 'An unknown error occurred.';\n }\n\n // Ignore cancel errors (user cancelled the request)\n if (error instanceof CancelError) {\n return undefined;\n }\n\n return fallbackText ?? 'An unknown error occurred.';\n }\n\n async #getErrorText(response: Response): Promise {\n switch (response.status) {\n case 400:\n case 401:\n return this.#localize.term('auth_userFailedLogin');\n\n case 402:\n return this.#localize.term('auth_mfaText');\n\n case 403:\n return this.#localize.term('auth_userLockedOut');\n\n default:\n return (\n this.#localize.term('auth_receivedErrorFromServer')\n );\n }\n }\n}\n","import {\n LoginRequestModel,\n LoginResponse,\n ResetPasswordResponse,\n ValidatePasswordResetCodeResponse,\n NewPasswordResponse,\n PasswordConfigurationModel, ValidateInviteCodeResponse, MfaCodeResponse\n} from \"../types.js\";\nimport { UmbAuthRepository } from './auth.repository.js';\nimport { UmbContextBase } from \"@umbraco-cms/backoffice/class-api\";\nimport { UmbContextToken } from \"@umbraco-cms/backoffice/context-api\";\n\nexport class UmbAuthContext extends UmbContextBase {\n readonly supportsPersistLogin = false;\n twoFactorView = '';\n isMfaEnabled = false;\n mfaProviders: string[] = [];\n passwordConfiguration?: PasswordConfigurationModel;\n\n #authRepository = new UmbAuthRepository(this);\n\n #returnPath = '';\n\n set returnPath(value: string) {\n this.#returnPath = value;\n }\n\n /**\n * Gets the return path from the query string.\n *\n * It will first look for a `ReturnUrl` parameter, then a `returnPath` parameter, and finally the `returnPath` property.\n *\n * @returns The return path from the query string.\n */\n get returnPath(): string {\n const params = new URLSearchParams(window.location.search);\n let returnPath = params.get('ReturnUrl') ?? params.get('returnPath') ?? this.#returnPath;\n\n // If return path is empty, return an empty string.\n if (!returnPath) {\n return '';\n }\n\n // Safely check that the return path is valid and doesn't link to an external site.\n const url = new URL(returnPath, window.location.origin);\n\n if (url.origin !== window.location.origin) {\n return '';\n }\n\n return url.toString();\n }\n\n login(data: LoginRequestModel): Promise {\n return this.#authRepository.login(data);\n }\n\n resetPassword(username: string): Promise {\n return this.#authRepository.resetPassword(username);\n }\n\n validatePasswordResetCode(userId: string, resetCode: string): Promise {\n return this.#authRepository.validatePasswordResetCode(userId, resetCode);\n }\n\n newPassword(password: string, resetCode: string, userId: string): Promise {\n return this.#authRepository.newPassword(password, resetCode, userId);\n }\n\n newInvitedUserPassword(password: string, token: string, userId: string): Promise {\n return this.#authRepository.newInvitedUserPassword(password, token, userId);\n }\n\n validateInviteCode(token: string, userId: string): Promise {\n return this.#authRepository.validateInviteCode(token, userId);\n }\n\n validateMfaCode(code: string, provider: string): Promise {\n return this.#authRepository.validateMfaCode(code, provider);\n }\n}\n\nexport const UMB_AUTH_CONTEXT = new UmbContextToken('UmbAuthContext');\n","import {\n UmbBundleExtensionInitializer,\n UmbServerExtensionRegistrator\n} from \"@umbraco-cms/backoffice/extension-api\";\nimport { umbExtensionsRegistry } from \"@umbraco-cms/backoffice/extension-registry\";\nimport type { UmbElement } from \"@umbraco-cms/backoffice/element-api\";\nimport { UmbControllerBase } from \"@umbraco-cms/backoffice/class-api\";\nimport { UUIIconRegistryEssential } from \"@umbraco-cms/backoffice/external/uui\";\n\n// We import what we need from the Backoffice app.\n// In the future the login screen app will be a part of the Backoffice app, and we will not need to import these.\nimport '@umbraco-cms/backoffice/localization';\n\n/**\n * This is the initializer for the slim backoffice.\n * It is responsible for initializing the backoffice and only the extensions that is needed to run the login screen.\n */\nexport class UmbSlimBackofficeController extends UmbControllerBase {\n #uuiIconRegistry = new UUIIconRegistryEssential();\n\n constructor(host: UmbElement) {\n super(host);\n new UmbBundleExtensionInitializer(host, umbExtensionsRegistry);\n new UmbServerExtensionRegistrator(host, umbExtensionsRegistry).registerPublicExtensions();\n\n this.#uuiIconRegistry.attach(host);\n\n host.classList.add('uui-text');\n host.classList.add('uui-font');\n }\n}\n","import type { ManifestBundle } from \"@umbraco-cms/backoffice/extension-api\";\n\nexport const name = 'Umbraco.Auth';\nexport const version = '1.0.0';\nexport const extensions: Array = [\n {\n name: 'Auth Bundle',\n alias: 'Umb.Auth.Bundle',\n type: 'bundle',\n js: () => import('./manifests.js'),\n },\n];\n","import { html, customElement, property, ifDefined } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from \"@umbraco-cms/backoffice/lit-element\";\nimport type { InputType, UUIFormLayoutItemElement } from \"@umbraco-cms/backoffice/external/uui\";\nimport { umbExtensionsRegistry } from \"@umbraco-cms/backoffice/extension-registry\";\n\nimport { UMB_AUTH_CONTEXT, UmbAuthContext } from \"./contexts\";\nimport { UmbSlimBackofficeController } from \"./controllers\";\n\n// We import the authStyles here so that we can inline it in the shadow DOM that is created outside of the UmbAuthElement.\nimport authStyles from './auth-styles.css?inline';\n\n// Import the main bundle\nimport { extensions } from './umbraco-package.js';\n\nconst createInput = (opts: {\n id: string;\n type: InputType;\n name: string;\n autocomplete: AutoFill;\n label: string;\n inputmode: string;\n autofocus?: boolean;\n}) => {\n const input = document.createElement('input');\n input.type = opts.type;\n input.name = opts.name;\n input.autocomplete = opts.autocomplete;\n input.id = opts.id;\n input.required = true;\n input.inputMode = opts.inputmode;\n input.ariaLabel = opts.label;\n input.autofocus = opts.autofocus || false;\n\n return input;\n};\n\nconst createLabel = (opts: { forId: string; localizeAlias: string; localizeFallback: string; }) => {\n const label = document.createElement('label');\n const umbLocalize: any = document.createElement('umb-localize');\n umbLocalize.key = opts.localizeAlias;\n umbLocalize.innerHTML = opts.localizeFallback;\n label.htmlFor = opts.forId;\n label.appendChild(umbLocalize);\n\n return label;\n};\n\nconst createFormLayoutItem = (label: HTMLLabelElement, input: HTMLInputElement) => {\n const formLayoutItem = document.createElement('uui-form-layout-item') as UUIFormLayoutItemElement;\n formLayoutItem.appendChild(label);\n formLayoutItem.appendChild(input);\n\n return formLayoutItem;\n};\n\nconst createForm = (elements: HTMLElement[]) => {\n const styles = document.createElement('style');\n styles.innerHTML = authStyles;\n const form = document.createElement('form');\n form.id = 'umb-login-form';\n form.name = 'login-form';\n form.spellcheck = false;\n\n elements.push(styles);\n elements.forEach((element) => form.appendChild(element));\n\n return form;\n};\n\n@customElement('umb-auth')\nexport default class UmbAuthElement extends UmbLitElement {\n /**\n * Disables the local login form and only allows external login providers.\n *\n * @attr disable-local-login\n */\n @property({type: Boolean, attribute: 'disable-local-login'})\n disableLocalLogin = false;\n\n @property({attribute: 'background-image'})\n backgroundImage?: string;\n\n @property({attribute: 'logo-image'})\n logoImage?: string;\n\n @property({attribute: 'logo-image-alternative'})\n logoImageAlternative?: string;\n\n @property({type: Boolean, attribute: 'username-is-email'})\n usernameIsEmail = false;\n\n @property({type: Boolean, attribute: 'allow-password-reset'})\n allowPasswordReset = false;\n\n @property({type: Boolean, attribute: 'allow-user-invite'})\n allowUserInvite = false;\n\n @property({attribute: 'return-url'})\n set returnPath(value: string) {\n this.#authContext.returnPath = value;\n }\n get returnPath() {\n return this.#authContext.returnPath;\n }\n\n /**\n * Override the default flow.\n */\n protected flow?: 'mfa' | 'reset-password' | 'invite-user';\n\n _form?: HTMLFormElement;\n _usernameLayoutItem?: UUIFormLayoutItemElement;\n _passwordLayoutItem?: UUIFormLayoutItemElement;\n _usernameInput?: HTMLInputElement;\n _passwordInput?: HTMLInputElement;\n _usernameLabel?: HTMLLabelElement;\n _passwordLabel?: HTMLLabelElement;\n\n #authContext = new UmbAuthContext(this, UMB_AUTH_CONTEXT);\n\n constructor() {\n super();\n\n (this as unknown as EventTarget).addEventListener('umb-login-flow', (e) => {\n if (e instanceof CustomEvent) {\n this.flow = e.detail.flow || undefined;\n }\n this.requestUpdate();\n });\n\n // Bind the (slim) Backoffice controller to this element so that we can use utilities from the Backoffice app.\n new UmbSlimBackofficeController(this);\n\n // Register the main package for Umbraco.Auth\n umbExtensionsRegistry.registerMany(extensions);\n }\n\n firstUpdated() {\n setTimeout(() => {\n requestAnimationFrame(() => {\n this.#initializeForm();\n });\n }, 100);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._usernameLayoutItem?.remove();\n this._passwordLayoutItem?.remove();\n this._usernameLabel?.remove();\n this._usernameInput?.remove();\n this._passwordLabel?.remove();\n this._passwordInput?.remove();\n }\n\n /**\n * Creates the login form and adds it to the DOM in the default slot.\n * This is done to avoid having to deal with the shadow DOM, which is not supported in Google Chrome for autocomplete/autofill.\n *\n * @see Track this intent-to-ship for Chrome https://groups.google.com/a/chromium.org/g/blink-dev/c/RY9leYMu5hI?pli=1\n * @private\n */\n #initializeForm() {\n const labelUsername = this.usernameIsEmail\n ? this.localize.term('auth_email')\n : this.localize.term('auth_username');\n const labelPassword = this.localize.term('auth_password');\n\n this._usernameInput = createInput({\n id: 'username-input',\n type: 'text',\n name: 'username',\n autocomplete: 'username',\n label: labelUsername,\n inputmode: this.usernameIsEmail ? 'email' : '',\n autofocus: true,\n });\n this._passwordInput = createInput({\n id: 'password-input',\n type: 'password',\n name: 'password',\n autocomplete: 'current-password',\n label: labelPassword,\n inputmode: '',\n });\n this._usernameLabel = createLabel({\n forId: 'username-input',\n localizeAlias: this.usernameIsEmail ? 'auth_email' : 'auth_username',\n localizeFallback: this.usernameIsEmail ? 'Email' : 'Username',\n });\n this._passwordLabel = createLabel({forId: 'password-input', localizeAlias: 'auth_password', localizeFallback: 'Password'});\n\n this._usernameLayoutItem = createFormLayoutItem(this._usernameLabel, this._usernameInput);\n this._passwordLayoutItem = createFormLayoutItem(this._passwordLabel, this._passwordInput);\n\n this._form = createForm([this._usernameLayoutItem, this._passwordLayoutItem]);\n\n this.insertAdjacentElement('beforeend', this._form);\n }\n\n render() {\n return html`\n \n ${this._renderFlowAndStatus()}\n \n `;\n }\n\n private _renderFlowAndStatus() {\n if (this.disableLocalLogin) {\n return html`\n \n Unfortunately, it is not possible to log in directly. It has been disabled by a login provider.\n \n `;\n }\n\n const searchParams = new URLSearchParams(window.location.search);\n let flow = this.flow || searchParams.get('flow')?.toLowerCase();\n const status = searchParams.get('status');\n\n if (status === 'resetCodeExpired') {\n return html`\n \n `;\n }\n\n if (flow === 'invite-user' && status === 'false') {\n return html`\n \n `;\n }\n\n // validate\n if (flow) {\n if (flow === 'mfa' && !this.#authContext.isMfaEnabled) {\n flow = undefined;\n }\n }\n\n switch (flow) {\n case 'mfa':\n return html`\n `;\n case 'reset':\n return html`\n `;\n case 'reset-password':\n return html`\n `;\n case 'invite-user':\n return html`\n `;\n\n default:\n return html`\n \n \n \n `;\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-auth': UmbAuthElement;\n }\n}\n","import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\nimport { css, CSSResultGroup, html, nothing, PropertyValueMap, customElement, property, when } from '@umbraco-cms/backoffice/external/lit';\n\n/**\n * The auth layout component.\n *\n * @element umb-auth-layout\n * @slot - The content of the layout\n * @cssprop --umb-login-background - The background of the layout (default: #f4f4f4)\n * @cssprop --umb-login-primary-color - The color of the headline (default: #283a97)\n * @cssprop --umb-login-text-color - The color of the text (default: #000)\n * @cssprop --umb-login-header-font-size - The font-size of the headline (default: 3rem)\n * @cssprop --umb-login-header-font-size-large - The font-size of the headline on large screens (default: 4rem)\n * @cssprop --umb-login-header-secondary-font-size - The font-size of the secondary headline (default: 2.4rem)\n * @cssprop --umb-login-image - The background of the image wrapper (default: the value of the backgroundImage property)\n * @cssprop --umb-login-image-display - The display of the image wrapper (default: flex)\n * @cssprop --umb-login-image-border-radius - The border-radius of the image wrapper (default: 38px)\n * @cssprop --umb-login-content-background - The background of the content wrapper (default: none)\n * @cssprop --umb-login-content-display - The display of the content wrapper (default: flex)\n * @cssprop --umb-login-content-width - The width of the content wrapper (default: 100%)\n * @cssprop --umb-login-content-height - The height of the content wrapper (default: 100%)\n * @cssprop --umb-login-content-border-radius - The border-radius of the content wrapper (default: 0)\n * @cssprop --umb-login-align-items - The align-items of the main wrapper (default: unset)\n * @cssprop --umb-login-button-border-radius - The border-radius of the buttons (default: 45px)\n * @cssprop --umb-login-curves-color - The color of the curves (default: #f5c1bc)\n * @cssprop --umb-login-curves-display - The display of the curves (default: inline)\n */\n@customElement('umb-auth-layout')\nexport class UmbAuthLayoutElement extends UmbLitElement {\n @property({ attribute: 'background-image' })\n backgroundImage?: string;\n\n @property({ attribute: 'logo-image' })\n logoImage?: string;\n\n @property({ attribute: 'logo-image-alternative' })\n logoImageAlternative?: string;\n\n protected updated(_changedProperties: PropertyValueMap | Map): void {\n super.updated(_changedProperties);\n\n if (_changedProperties.has('backgroundImage')) {\n this.style.setProperty('--logo-alternative-display', this.backgroundImage ? 'none' : 'unset');\n this.style.setProperty('--image', `url('${this.backgroundImage}') no-repeat center center/cover`);\n }\n }\n\n #renderImageContainer() {\n if (!this.backgroundImage) return nothing;\n\n return html`\n
\n
\n \n \n \n \n \n \n\n ${when(\n this.logoImage,\n () => html`\"logo\"`\n )}\n
\n
\n `;\n }\n\n #renderContent() {\n return html`\n
\n
\n \n
\n
\n `;\n }\n\n render() {\n return html`\n
\n ${this.#renderImageContainer()} ${this.#renderContent()}\n
\n ${when(\n this.logoImageAlternative,\n () => html`\"logo\"`\n )}\n `;\n }\n\n static styles: CSSResultGroup = [\n css`\n :host {\n --uui-color-interactive: var(--umb-login-primary-color, #283a97);\n --uui-button-border-radius: var(--umb-login-button-border-radius, 45px);\n --uui-color-default: var(--uui-color-interactive);\n --uui-button-height: 42px;\n --uui-select-height: 38px;\n\n --input-height: 40px;\n --header-font-size: var(--umb-login-header-font-size, 3rem);\n --header-secondary-font-size: var(--umb-login-header-secondary-font-size, 2.4rem);\n --curves-color: var(--umb-login-curves-color, #f5c1bc);\n --curves-display: var(--umb-login-curves-display, inline);\n\n display: block;\n background: var(--umb-login-background, #f4f4f4);\n color: var(--umb-login-text-color, #000);\n }\n\n #main-no-image,\n #main {\n max-width: 1920px;\n display: flex;\n justify-content: center;\n height: 100vh;\n padding: 8px;\n box-sizing: border-box;\n margin: 0 auto;\n }\n\n #image-container {\n display: var(--umb-login-image-display, none);\n width: 100%;\n }\n\n #content-container {\n background: var(--umb-login-content-background, none);\n display: var(--umb-login-content-display, flex);\n width: var(--umb-login-content-width, 100%);\n height: var(--umb-login-content-height, 100%);\n box-sizing: border-box;\n overflow: auto;\n border-radius: var(--umb-login-content-border-radius, 0);\n }\n\n #content {\n max-width: 360px;\n margin: auto;\n width: 100%;\n }\n\n #image {\n background: var(--umb-login-image, var(--image));\n width: 100%;\n height: 100%;\n border-radius: var(--umb-login-image-border-radius, 38px);\n position: relative;\n overflow: hidden;\n color: var(--curves-color);\n }\n\n #image svg {\n position: absolute;\n width: 45%;\n height: fit-content;\n display: var(--curves-display);\n }\n\n #curve-top {\n top: 0;\n right: 0;\n }\n\n #curve-bottom {\n bottom: 0;\n left: 0;\n }\n\n #logo-on-image,\n #logo-on-background {\n position: absolute;\n top: 24px;\n left: 24px;\n height: 55px;\n }\n\n @media only screen and (min-width: 900px) {\n :host {\n --header-font-size: var(--umb-login-header-font-size-large, 4rem);\n }\n\n #main {\n padding: 32px;\n padding-right: 0;\n align-items: var(--umb-login-align-items, unset);\n }\n\n #image-container {\n display: var(--umb-login-image-display, block);\n }\n\n #content-container {\n display: var(--umb-login-content-display, flex);\n padding: 16px;\n }\n\n #logo-on-background {\n display: var(--logo-alternative-display);\n }\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-auth-layout': UmbAuthLayoutElement;\n }\n}\n","import { CSSResultGroup, css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from \"@umbraco-cms/backoffice/lit-element\";\n\n@customElement('umb-confirmation-layout')\nexport default class UmbConfirmationLayoutElement extends UmbLitElement {\n @property({ type: String })\n header = '';\n\n @property({ type: String })\n message = '';\n\n render() {\n return html`\n
\n

${this.header}

\n ${this.message}\n
\n\n \n\n \n `;\n }\n\n static styles: CSSResultGroup = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-layout-1);\n }\n\n #header {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-space-5);\n }\n\n #header span {\n color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n font-size: 14px;\n }\n\n #header h1 {\n margin: 0;\n font-weight: 400;\n font-size: var(--header-secondary-font-size);\n color: var(--uui-color-interactive);\n line-height: 1.2;\n }\n\n uui-button {\n width: 100%;\n margin-top: var(--uui-size-space-5);\n --uui-button-padding-top-factor: 1.5;\n --uui-button-padding-bottom-factor: 1.5;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-confirmation-layout': UmbConfirmationLayoutElement;\n }\n}\n","import { CSSResultGroup, css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from \"@umbraco-cms/backoffice/lit-element\";\n\n@customElement('umb-error-layout')\nexport default class UmbErrorLayoutElement extends UmbLitElement {\n @property({ type: String })\n header = '';\n\n @property({ type: String })\n message = '';\n\n @property({ type: Boolean, attribute: 'no-back-link' })\n noBackLink = false;\n\n render() {\n return html`\n
\n

${this.header?.length ? this.header : html`Hi there`}

\n ${this.message}\n
\n \n ${!this.noBackLink ? html``: ''}\n `;\n }\n\n static styles: CSSResultGroup = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-layout-1);\n }\n\n #header {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-space-5);\n }\n\n #header span {\n color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n font-size: 14px;\n }\n\n #header h1 {\n margin: 0;\n font-weight: 400;\n font-size: var(--header-secondary-font-size);\n color: var(--uui-color-interactive);\n line-height: 1.2;\n }\n\n ::slotted(uui-button) {\n width: 100%;\n margin-top: var(--uui-size-space-5);\n --uui-button-padding-top-factor: 1.5;\n --uui-button-padding-bottom-factor: 1.5;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-error-layout': UmbErrorLayoutElement;\n }\n}\n","import type { UUIButtonState, UUIInputPasswordElement } from '@umbraco-cms/backoffice/external/uui';\nimport { type CSSResultGroup, css, html, nothing, customElement, property, query, state } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from \"@umbraco-cms/backoffice/lit-element\";\n\nimport { UMB_AUTH_CONTEXT } from '../../contexts';\n\n@customElement('umb-new-password-layout')\nexport default class UmbNewPasswordLayoutElement extends UmbLitElement {\n @query('#password')\n passwordElement!: UUIInputPasswordElement;\n\n @query('#confirmPassword')\n confirmPasswordElement!: UUIInputPasswordElement;\n\n @property()\n state: UUIButtonState = undefined;\n\n @property()\n error: string = '';\n\n @property()\n userId: string = '';\n\n @property({ type: Boolean, attribute: 'is-invite' })\n isInvite = false;\n\n @state()\n _passwordConfiguration?: typeof UMB_AUTH_CONTEXT.TYPE['passwordConfiguration'];\n\n @state()\n _passwordPattern = '';\n\n constructor() {\n super();\n\n this.consumeContext(UMB_AUTH_CONTEXT, (authContext) => {\n this._passwordConfiguration = authContext.passwordConfiguration;\n // Build a pattern\n let pattern = '';\n if (this._passwordConfiguration?.requireDigit) {\n pattern += '(?=.*\\\\d)';\n }\n if (this._passwordConfiguration?.requireLowercase) {\n pattern += '(?=.*[a-z])';\n }\n if (this._passwordConfiguration?.requireUppercase) {\n pattern += '(?=.*[A-Z])';\n }\n if (this._passwordConfiguration?.requireNonLetterOrDigit) {\n pattern += '(?=.*\\\\W)';\n }\n pattern += `.{${this._passwordConfiguration?.minimumPasswordLength ?? 10},}`;\n this._passwordPattern = pattern;\n });\n }\n\n #onSubmit(event: Event) {\n event.preventDefault();\n if (!this._passwordConfiguration) return;\n\n const form = event.target as HTMLFormElement;\n\n this.passwordElement.setCustomValidity('');\n this.confirmPasswordElement.setCustomValidity('');\n\n if (!form) return;\n if (!form.checkValidity()) return;\n\n const formData = new FormData(form);\n const password = formData.get('password') as string;\n const passwordConfirm = formData.get('confirmPassword') as string;\n\n let passwordIsInvalid = false;\n\n if (this._passwordConfiguration.minimumPasswordLength > 0 && password.length < this._passwordConfiguration.minimumPasswordLength) {\n passwordIsInvalid = true;\n }\n\n if (this._passwordConfiguration.requireNonLetterOrDigit) {\n const hasNonLetterOrDigit = /\\W/.test(password);\n if (!hasNonLetterOrDigit) {\n passwordIsInvalid = true;\n }\n }\n\n if (this._passwordConfiguration.requireDigit) {\n const hasDigit = /\\d/.test(password);\n if (!hasDigit) {\n passwordIsInvalid = true;\n }\n }\n\n if (this._passwordConfiguration.requireLowercase) {\n const hasLowercase = /[a-z]/.test(password);\n if (!hasLowercase) {\n passwordIsInvalid = true;\n }\n }\n\n if (this._passwordConfiguration.requireUppercase) {\n const hasUppercase = /[A-Z]/.test(password);\n if (!hasUppercase) {\n passwordIsInvalid = true;\n }\n }\n\n if (passwordIsInvalid) {\n const passwordValidityText = this.localize.term(\n 'auth_errorInPasswordFormat',\n this._passwordConfiguration.minimumPasswordLength,\n this._passwordConfiguration.requireNonLetterOrDigit ? 1 : 0\n ) ?? 'The password does not meet the minimum requirements!';\n this.passwordElement.setCustomValidity(passwordValidityText);\n return;\n }\n\n if (password !== passwordConfirm) {\n const passwordValidityText = this.localize.term(\n 'auth_passwordMismatch'\n ) ?? \"The confirmed password doesn't match the new password!\";\n this.confirmPasswordElement.setCustomValidity(passwordValidityText);\n return;\n }\n\n this.dispatchEvent(new CustomEvent('submit', {detail: {password}}));\n }\n\n renderHeader() {\n if (this.isInvite) {\n return html`\n

Hi!

\n \n \n Welcome to Umbraco! Just need to get your password setup and then you're good to go\n \n \n `;\n } else {\n return html`\n

\n New password\n

\n \n Please provide a new password.\n \n `;\n }\n }\n\n render() {\n return html`\n \n
\n
${this.renderHeader()}
\n \n \n New password\n \n \n \n \n\n \n \n Confirm new password\n \n \n \n\n ${this.#renderErrorMessage()}\n\n \n \n
\n\n \n `;\n }\n\n #renderErrorMessage() {\n if (!this.error || this.state !== 'failed') return nothing;\n\n return html`${this.error}`;\n }\n\n static styles: CSSResultGroup = [\n css`\n #header {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-space-5);\n }\n\n #header span {\n color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n font-size: 14px;\n }\n\n #header h1 {\n margin: 0;\n font-weight: 400;\n font-size: var(--header-secondary-font-size);\n color: var(--uui-color-interactive);\n line-height: 1.2;\n }\n\n form {\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-space-5);\n }\n\n uui-form-layout-item {\n margin: 0;\n }\n\n uui-input-password {\n width: 100%;\n height: var(--input-height);\n border-radius: var(--uui-border-radius);\n }\n\n uui-button {\n width: 100%;\n margin-top: var(--uui-size-space-5);\n --uui-button-padding-top-factor: 1.5;\n --uui-button-padding-bottom-factor: 1.5;\n }\n\n .text-danger {\n color: var(--uui-color-danger-standalone);\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-new-password-layout': UmbNewPasswordLayoutElement;\n }\n}\n","import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui';\nimport { html, customElement, state } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\nimport { UMB_AUTH_CONTEXT } from \"../../contexts\";\n\n@customElement('umb-invite-page')\nexport default class UmbInvitePageElement extends UmbLitElement {\n #token = '';\n #userId = '';\n\n @state()\n state: UUIButtonState = undefined;\n\n @state()\n error = '';\n\n @state()\n loading = true;\n\n #authContext?: typeof UMB_AUTH_CONTEXT.TYPE;\n\n constructor() {\n super();\n\n this.consumeContext(UMB_AUTH_CONTEXT, (authContext) => {\n this.#authContext = authContext;\n this.#init();\n });\n }\n\n async #init() {\n const urlParams = new URLSearchParams(window.location.search);\n const token = urlParams.get('inviteCode');\n const userId = urlParams.get('userId');\n\n if (!token || !userId) {\n this.error = 'The invite has expired or is invalid';\n this.loading = false;\n return;\n }\n\n if (!this.#authContext) return;\n\n this.#token = token;\n this.#userId = userId;\n\n const response = await this.#authContext.validateInviteCode(this.#token, this.#userId);\n\n if (response.error) {\n this.error = response.error;\n this.loading = false;\n return;\n }\n\n if (!response.passwordConfiguration) {\n this.error = 'There is no password configuration for the invite code. Please contact the administrator.';\n this.loading = false;\n return;\n }\n\n this.#authContext.passwordConfiguration = response.passwordConfiguration;\n this.loading = false;\n }\n\n async #onSubmit(event: CustomEvent) {\n event.preventDefault();\n const password = event.detail.password;\n\n if (!password) return;\n\n if (!this.#authContext) return;\n\n this.state = 'waiting';\n const response = await this.#authContext.newInvitedUserPassword(password, this.#token, this.#userId);\n\n if (response.error) {\n this.error = response.error;\n this.state = 'failed';\n return;\n }\n\n this.state = 'success';\n window.location.href = this.#authContext.returnPath;\n }\n\n render() {\n return this.loading ? html`` : (\n this.error\n ? html`\n \n `\n : html`\n `\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-invite-page': UmbInvitePageElement;\n }\n}\n","import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui';\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\nimport { css, type CSSResultGroup, html, nothing, when, customElement, property, queryAssignedElements, state } from '@umbraco-cms/backoffice/external/lit';\n\nimport { UMB_AUTH_CONTEXT } from '../../contexts';\n\n@customElement('umb-login-page')\nexport default class UmbLoginPageElement extends UmbLitElement {\n @property({type: Boolean, attribute: 'username-is-email'})\n usernameIsEmail = false;\n\n @queryAssignedElements({flatten: true})\n protected slottedElements?: HTMLFormElement[];\n\n @property({type: Boolean, attribute: 'allow-password-reset'})\n allowPasswordReset = false;\n\n @state()\n private _loginState?: UUIButtonState;\n\n @state()\n private _loginError = '';\n\n @state()\n supportPersistLogin = false;\n\n #formElement?: HTMLFormElement;\n\n #authContext?: typeof UMB_AUTH_CONTEXT.TYPE;\n\n constructor() {\n super();\n\n this.consumeContext(UMB_AUTH_CONTEXT, (authContext) => {\n this.#authContext = authContext;\n this.supportPersistLogin = authContext.supportsPersistLogin;\n });\n }\n\n async #onSlotChanged() {\n this.#formElement = this.slottedElements?.find((el) => el.id === 'umb-login-form');\n\n if (!this.#formElement) return;\n\n // We need to listen for the enter key to submit the form, because the uui-button does not support the native input fields submit event\n this.#formElement.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') {\n this.#onSubmitClick();\n }\n });\n this.#formElement.onsubmit = this.#handleSubmit;\n }\n\n #handleSubmit = async (e: SubmitEvent) => {\n e.preventDefault();\n\n if (!this.#authContext) return;\n\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n const formData = new FormData(form);\n\n const username = formData.get('username') as string;\n const password = formData.get('password') as string;\n const persist = formData.has('persist');\n\n if (!username || !password) {\n this._loginError = this.localize.term('auth_userFailedLogin');\n this._loginState = 'failed';\n return;\n }\n\n this._loginState = 'waiting';\n\n const response = await this.#authContext.login({\n username,\n password,\n persist,\n });\n\n this._loginError = response.error || '';\n this._loginState = response.error ? 'failed' : 'success';\n\n // Check for 402 status code indicating that MFA is required\n if (response.status === 402) {\n this.#authContext.isMfaEnabled = true;\n if (response.twoFactorView) {\n this.#authContext.twoFactorView = response.twoFactorView;\n }\n if (response.twoFactorProviders) {\n this.#authContext.mfaProviders = response.twoFactorProviders;\n }\n\n this.dispatchEvent(new CustomEvent('umb-login-flow', {composed: true, detail: {flow: 'mfa'}}));\n return;\n }\n\n if (response.error) {\n return;\n }\n\n const returnPath = this.#authContext.returnPath;\n\n if (returnPath) {\n location.href = returnPath;\n }\n };\n\n get #greetingLocalizationKey() {\n return [\n 'auth_greeting0',\n 'auth_greeting1',\n 'auth_greeting2',\n 'auth_greeting3',\n 'auth_greeting4',\n 'auth_greeting5',\n 'auth_greeting6',\n ][new Date().getDay()];\n }\n\n #onSubmitClick = () => {\n this.#formElement?.requestSubmit();\n };\n\n render() {\n return html`\n
\n

\n Welcome\n

\n \n
\n \n
\n ${when(\n this.supportPersistLogin,\n () => html`\n \n \n Remember me\n \n `\n )}\n ${when(\n this.allowPasswordReset,\n () =>\n html`\n `\n )}\n
\n \n\n ${this.#renderErrorMessage()}\n `;\n }\n\n #renderErrorMessage() {\n if (!this._loginError || this._loginState !== 'failed') return nothing;\n\n return html`${this._loginError}`;\n }\n\n #handleForgottenPassword() {\n this.dispatchEvent(new CustomEvent('umb-login-flow', {composed: true, detail: {flow: 'reset'}}));\n }\n\n static styles: CSSResultGroup = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n }\n\n #header {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-space-5);\n }\n\n #header span {\n color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n font-size: 14px;\n }\n\n #greeting {\n color: var(--uui-color-interactive);\n text-align: center;\n font-weight: 400;\n font-size: var(--header-font-size);\n margin: 0 0 var(--uui-size-layout-1);\n line-height: 1.2;\n }\n\n #umb-login-button {\n margin-top: var(--uui-size-space-4);\n width: 100%;\n }\n\n #forgot-password {\n cursor: pointer;\n background: none;\n border: 0;\n height: 1rem;\n color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n gap: var(--uui-size-space-1);\n align-self: center;\n text-decoration: none;\n display: inline-flex;\n line-height: 1;\n font-size: 14px;\n font-family: var(--uui-font-family),sans-serif;\n margin-left: auto;\n margin-bottom: var(--uui-size-space-3);\n }\n\n #forgot-password:hover {\n color: var(--uui-color-interactive-emphasis);\n }\n\n .text-error {\n margin-top: var(--uui-size-space-4);\n }\n\n .text-danger {\n color: var(--uui-color-danger-standalone);\n }\n\n #secondary-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-login-page': UmbLoginPageElement;\n }\n}\n","import { html, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\n\n/**\n * Try to load a custom view.\n * Supports both HTML and JS files (JS files must have a default export).\n *\n * @param view The path to the custom view.\n * @returns A view part.\n */\nexport async function loadCustomView(view: string): Promise {\n\tif (view.endsWith('.html')) {\n\t\treturn fetch(view).then((response) => response.text());\n\t}\n\n\tconst module = await import(/* @vite-ignore */ view);\n\n\tif (!module.default) throw new Error('No default export found');\n\n\treturn new module.default() as T;\n}\n\nexport function renderCustomView(view: T | string) {\n\tif (typeof view === 'string') {\n\t\treturn html`${unsafeHTML(view)}`;\n\t}\n\n\treturn view;\n}\n","import type {UUIButtonState, UUIInputElement} from '@umbraco-cms/backoffice/external/uui';\nimport {css, html, nothing, customElement, state, until} from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from \"@umbraco-cms/backoffice/lit-element\";\n\nimport { loadCustomView, renderCustomView } from '../../utils/load-custom-view.function.js';\nimport { UMB_AUTH_CONTEXT } from \"../../contexts\";\n\ntype MfaCustomViewElement = HTMLElement & {\n providers?: string[];\n returnPath?: string;\n};\n\n@customElement('umb-mfa-page')\nexport default class UmbMfaPageElement extends UmbLitElement {\n @state()\n protected providers: Array<{ name: string; value: string; selected: boolean }> = [];\n\n @state()\n private buttonState?: UUIButtonState;\n\n @state()\n private error: string | null = null;\n\n #authContext?: typeof UMB_AUTH_CONTEXT.TYPE;\n\n constructor() {\n super();\n this.consumeContext(UMB_AUTH_CONTEXT, authContext => {\n this.#authContext = authContext;\n this.#loadProviders();\n });\n }\n\n #loadProviders() {\n this.providers = this.#authContext?.mfaProviders.map((provider) => ({name: provider, value: provider, selected: false})) ?? [];\n\n if (this.providers.length) {\n this.providers[0].selected = true;\n } else {\n this.error = 'Error: No providers available';\n }\n }\n\n async #handleSubmit(e: SubmitEvent) {\n e.preventDefault();\n\n if (!this.#authContext) return;\n\n this.error = null;\n\n const form = e.target as HTMLFormElement;\n if (!form) return;\n\n const codeInput = form.elements.namedItem('mfacode') as UUIInputElement;\n\n if (codeInput) {\n codeInput.error = false;\n codeInput.errorMessage = '';\n codeInput.setCustomValidity('');\n }\n\n if (!form.checkValidity()) return;\n\n const formData = new FormData(form);\n\n let provider = formData.get('provider') as string;\n\n // If no provider given, use the first one (there probably is only one anyway)\n if (!provider) {\n // If there are no providers, we can't continue\n if (!this.providers.length) {\n this.error = 'No providers available';\n return;\n }\n\n provider = this.providers[0].value;\n }\n\n if (!provider) {\n this.error = 'No provider selected';\n return;\n }\n\n const code = formData.get('token') as string;\n\n this.buttonState = 'waiting';\n\n const response = await this.#authContext.validateMfaCode(code, provider);\n if (response.error) {\n if (codeInput) {\n codeInput.error = true;\n codeInput.errorMessage = response.error;\n } else {\n this.error = response.error;\n }\n this.buttonState = 'failed';\n return;\n }\n\n this.buttonState = 'success';\n\n const returnPath = this.#authContext.returnPath;\n if (returnPath) {\n location.href = returnPath;\n }\n }\n\n protected renderDefaultView() {\n return html`\n \n
\n
\n

\n One last step\n

\n\n

\n \n You have enabled 2-factor authentication and must verify your identity.\n \n

\n
\n\n \n ${this.providers.length > 1\n ? html`\n \n \n Please choose a 2-factor provider\n \n \n \n `\n : nothing}\n\n \n \n Verification code\n \n\n \n \n \n\n ${this.error ? html` ${this.error} ` : nothing}\n\n \n \n
\n\n \n `;\n }\n\n protected async renderCustomView() {\n const view = this.#authContext?.twoFactorView;\n if (!view) return nothing;\n\n try {\n const customView = await loadCustomView(view);\n if (typeof customView === 'object') {\n customView.providers = this.providers.map((provider) => provider.value);\n customView.returnPath = this.#authContext?.returnPath ?? '';\n }\n return renderCustomView(customView);\n } catch (e) {\n const error = e instanceof Error ? e.message : 'Unknown error';\n console.group('[MFA login] Failed to load custom view');\n console.log('Element reference', this);\n console.log('Custom view', view);\n console.error('Failed to load custom view:', e);\n console.groupEnd();\n return html`${error}`;\n }\n }\n\n protected render() {\n return this.#authContext?.twoFactorView\n ? until(this.renderCustomView(), html`\n `)\n : this.renderDefaultView();\n }\n\n static styles = [\n css`\n #header {\n text-align: center;\n }\n\n #header h1 {\n font-weight: 400;\n font-size: var(--header-secondary-font-size);\n color: var(--uui-color-interactive);\n line-height: 1.2;\n }\n\n form {\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-layout-2);\n }\n\n #provider {\n width: 100%;\n }\n\n uui-form-layout-item {\n margin: 0;\n }\n\n uui-input,\n uui-input-password {\n width: 100%;\n height: var(--input-height);\n border-radius: var(--uui-border-radius);\n }\n\n uui-input {\n width: 100%;\n }\n\n uui-button {\n width: 100%;\n --uui-button-padding-top-factor: 1.5;\n --uui-button-padding-bottom-factor: 1.5;\n }\n\n .text-danger {\n color: var(--uui-color-danger-standalone);\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-mfa-page': UmbMfaPageElement;\n }\n}\n","import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui';\nimport { html, customElement, state } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\n\nimport { UMB_AUTH_CONTEXT } from \"../../contexts\";\n\n@customElement('umb-new-password-page')\nexport default class UmbNewPasswordPageElement extends UmbLitElement {\n @state()\n state: UUIButtonState = undefined;\n\n @state()\n page: 'new' | 'done' | 'error' = 'new';\n\n @state()\n error = '';\n\n @state()\n userId = '';\n\n @state()\n resetCode = '';\n\n @state()\n loading = true;\n\n #authContext?: typeof UMB_AUTH_CONTEXT.TYPE;\n\n constructor() {\n super();\n this.consumeContext(UMB_AUTH_CONTEXT, (authContext) => {\n this.#authContext = authContext;\n this.#init();\n });\n }\n\n async #init() {\n const urlParams = new URLSearchParams(window.location.search);\n const resetCode = urlParams.get('resetCode');\n const userId = urlParams.get('userId');\n\n if (!userId || !resetCode) {\n this.page = 'error';\n this.loading = false;\n return;\n }\n\n if (!this.#authContext) return;\n\n this.resetCode = resetCode;\n this.userId = userId;\n\n const verifyResponse = await this.#authContext.validatePasswordResetCode(this.userId, this.resetCode);\n\n if (verifyResponse.error) {\n this.page = 'error';\n this.error = verifyResponse.error;\n this.loading = false;\n return;\n }\n\n if (!verifyResponse.passwordConfiguration) {\n this.page = 'error';\n this.error = 'Password configuration is missing';\n this.loading = false;\n return;\n }\n\n this.#authContext.passwordConfiguration = verifyResponse.passwordConfiguration;\n\n this.loading = false;\n }\n\n async #onSubmit(event: CustomEvent) {\n event.preventDefault();\n\n this.error = '';\n\n if (!this.#authContext) return;\n\n const password = event.detail.password;\n\n this.state = 'waiting';\n const response = await this.#authContext.newPassword(password, this.resetCode, this.userId);\n\n if (response.error) {\n this.state = 'failed';\n this.error = response.error;\n return;\n }\n\n this.state = 'success';\n this.page = 'done';\n }\n\n #renderRoutes() {\n switch (this.page) {\n case 'new':\n return html`\n `;\n case 'error':\n return html`\n \n `;\n case 'done':\n return html`\n \n `;\n }\n }\n\n render() {\n return this.loading ? html`` : this.#renderRoutes();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-new-password-page': UmbNewPasswordPageElement;\n }\n}\n","import type {UUIButtonState} from '@umbraco-cms/backoffice/external/uui';\nimport {type CSSResultGroup, css, html, nothing, customElement, state} from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from \"@umbraco-cms/backoffice/lit-element\";\n\nimport { UMB_AUTH_CONTEXT } from '../../contexts';\n\n@customElement('umb-reset-password-page')\nexport default class UmbResetPasswordPageElement extends UmbLitElement {\n @state()\n resetCallState: UUIButtonState = undefined;\n\n @state()\n error = '';\n\n #handleResetSubmit = async (e: SubmitEvent) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n\n if (!form) return;\n if (!form.checkValidity()) return;\n\n const formData = new FormData(form);\n const username = formData.get('email') as string;\n\n this.resetCallState = 'waiting';\n const authContext = await this.getContext(UMB_AUTH_CONTEXT);\n const response = await authContext.resetPassword(username);\n this.resetCallState = response.error ? 'failed' : 'success';\n this.error = response.error || '';\n };\n\n #renderResetPage() {\n return html`\n \n
\n
\n

\n Forgotten password?\n

\n \n\t\t\t\t\t\t\t\n An email will be sent to the address specified with a link to reset your password\n \n\t\t\t\t\t\t\n
\n\n \n \n Email\n \n \n \n \n\n ${this.#renderErrorMessage()}\n\n \n \n
\n\n \n `;\n }\n\n #renderErrorMessage() {\n if (!this.error || this.resetCallState !== 'failed') return nothing;\n\n return html`${this.error}`;\n }\n\n #renderConfirmationPage() {\n return html`\n \n \n `;\n }\n\n render() {\n return this.resetCallState === 'success' ? this.#renderConfirmationPage() : this.#renderResetPage();\n }\n\n static styles: CSSResultGroup = [\n css`\n #header {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-space-5);\n }\n\n #header span {\n color: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n font-size: 14px;\n }\n\n #header h1 {\n margin: 0;\n font-weight: 400;\n font-size: var(--header-secondary-font-size);\n color: var(--uui-color-interactive);\n line-height: 1.2;\n }\n\n form {\n display: flex;\n flex-direction: column;\n gap: var(--uui-size-layout-2);\n }\n\n uui-form-layout-item {\n margin: 0;\n }\n\n uui-input,\n uui-input-password {\n width: 100%;\n height: var(--input-height);\n border-radius: var(--uui-border-radius);\n }\n\n uui-input {\n width: 100%;\n }\n\n uui-button {\n width: 100%;\n --uui-button-padding-top-factor: 1.5;\n --uui-button-padding-bottom-factor: 1.5;\n }\n\n #resend {\n display: inline-flex;\n font-size: 14px;\n align-self: center;\n gap: var(--uui-size-space-1);\n }\n\n #resend a {\n color: var(--uui-color-selected);\n font-weight: 600;\n text-decoration: none;\n }\n\n #resend a:hover {\n color: var(--uui-color-interactive-emphasis);\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'umb-reset-password-page': UmbResetPasswordPageElement;\n }\n}\n","import { CSSResultGroup, css, html, customElement } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\n\n@customElement('umb-back-to-login-button')\nexport default class UmbBackToLoginButtonElement extends UmbLitElement {\n\trender() {\n\t\treturn html`\n\t\t\t\n\t\t`;\n\t}\n\n\t#handleClick() {\n\t\tthis.dispatchEvent(new CustomEvent('umb-login-flow', { composed: true, detail: { flow: 'login' } }));\n\t}\n\n\tstatic styles: CSSResultGroup = [\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t\tbutton {\n\t\t\t\tcursor: pointer;\n\t\t\t\tbackground: none;\n\t\t\t\tborder: 0;\n\t\t\t\theight: 1rem;\n\t\t\t\tcolor: var(--uui-color-text-alt); /* TODO Change to uui color when uui gets a muted text variable */\n\t\t\t\tgap: var(--uui-size-space-1);\n\t\t\t\talign-self: center;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\tline-height: 1;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: var(--uui-font-family),sans-serif;\n\t\t\t}\n\t\t\tbutton svg {\n\t\t\t\twidth: 1rem;\n\t\t\t}\n\t\t\tbutton:hover {\n\t\t\t\tcolor: var(--uui-color-interactive-emphasis);\n\t\t\t}\n\t\t`,\n\t];\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'umb-back-to-login-button': UmbBackToLoginButtonElement;\n\t}\n}\n"],"names":["UmbAuthRepository","UmbRepositoryBase","#localize","UmbLocalizationController","data","request","response","responseData","#getErrorText","error","code","provider","requestData","email","tryExecute","SecurityService","#getApiErrorDetailText","userId","resetCode","password","token","UserService","fallbackText","ApiError","CancelError","UmbAuthContext","UmbContextBase","#authRepository","#returnPath","value","params","returnPath","url","username","UMB_AUTH_CONTEXT","UmbContextToken","UmbSlimBackofficeController","UmbControllerBase","#uuiIconRegistry","UUIIconRegistryEssential","host","UmbBundleExtensionInitializer","umbExtensionsRegistry","UmbServerExtensionRegistrator","extensions","_authContext","_UmbAuthElement_instances","initializeForm_fn","createInput","opts","input","createLabel","label","umbLocalize","createFormLayoutItem","formLayoutItem","createForm","elements","styles","authStyles","form","element","UmbAuthElement","UmbLitElement","__privateAdd","e","__privateGet","__privateMethod","html","ifDefined","searchParams","flow","status","labelUsername","labelPassword","__decorateClass","property","customElement","_UmbAuthLayoutElement_instances","renderImageContainer_fn","renderContent_fn","UmbAuthLayoutElement","_changedProperties","when","nothing","css","UmbConfirmationLayoutElement","UmbErrorLayoutElement","_UmbNewPasswordLayoutElement_instances","onSubmit_fn","renderErrorMessage_fn","UmbNewPasswordLayoutElement","authContext","pattern","event","formData","passwordConfirm","passwordIsInvalid","passwordValidityText","query","state","_token","_userId","_UmbInvitePageElement_instances","init_fn","UmbInvitePageElement","__privateSet","urlParams","_formElement","_UmbLoginPageElement_instances","onSlotChanged_fn","_handleSubmit","greetingLocalizationKey_get","_onSubmitClick","handleForgottenPassword_fn","UmbLoginPageElement","persist","el","queryAssignedElements","loadCustomView","view","module","renderCustomView","unsafeHTML","_UmbMfaPageElement_instances","loadProviders_fn","handleSubmit_fn","UmbMfaPageElement","customView","until","codeInput","_UmbNewPasswordPageElement_instances","renderRoutes_fn","UmbNewPasswordPageElement","verifyResponse","_handleResetSubmit","_UmbResetPasswordPageElement_instances","renderResetPage_fn","renderConfirmationPage_fn","UmbResetPasswordPageElement","_UmbBackToLoginButtonElement_instances","handleClick_fn","UmbBackToLoginButtonElement"],"mappings":"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"}