barsa-auth 2.3.164 → 2.3.167

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,208 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, EventEmitter, inject, Input, Output, ChangeDetectionStrategy, Component, NgZone, ViewChild, ViewChildren, input, TemplateRef, NgModule } from '@angular/core';
2
+ import { inject, Injectable, signal, EventEmitter, Input, Output, ChangeDetectionStrategy, Component, NgZone, ViewChild, ViewChildren, input, TemplateRef, NgModule } from '@angular/core';
3
3
  import * as i3 from 'barsa-novin-ray-core';
4
- import { BaseController, BarsaApi, ViewBase, forbiddenValidator, mobile_regex, BaseComponent, getUniqueId, validateAllFormFields, PortalService, ApplicationCtrlrService, BaseModule, DynamicComponentService, BarsaNovinRayCoreModule } from 'barsa-novin-ray-core';
4
+ import { getUniqueId, BaseController, BarsaApi, ViewBase, forbiddenValidator, mobile_regex, BaseComponent, validateAllFormFields, PortalService, ApplicationCtrlrService, BaseModule, DynamicComponentService, BarsaNovinRayCoreModule } from 'barsa-novin-ray-core';
5
+ import { HttpClient, HttpErrorResponse } from '@angular/common/http';
6
+ import { firstValueFrom, finalize, catchError, throwError } from 'rxjs';
5
7
  import * as i1 from '@angular/common';
6
8
  import { CommonModule } from '@angular/common';
7
- import { HttpClient } from '@angular/common/http';
8
- import { finalize, catchError, throwError } from 'rxjs';
9
9
  import * as i2 from '@angular/forms';
10
10
  import { FormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
11
11
  import { ActivatedRoute } from '@angular/router';
12
12
 
13
+ function decodeBase64Url(value) {
14
+ const padding = '='.repeat((4 - (value.length % 4)) % 4);
15
+ const binary = globalThis.atob(value.replace(/-/g, '+').replace(/_/g, '/') + padding);
16
+ const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
17
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
18
+ }
19
+ function encodeBase64Url(value) {
20
+ const bytes = new Uint8Array(value);
21
+ let binary = '';
22
+ for (const byte of bytes) {
23
+ binary += String.fromCharCode(byte);
24
+ }
25
+ return globalThis.btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
26
+ }
27
+
28
+ class PasskeyService {
29
+ constructor() {
30
+ this.httpClient = inject(HttpClient);
31
+ }
32
+ isPlatformAuthenticatorAvailable() {
33
+ if (!this.platformAvailability) {
34
+ this.platformAvailability = this.detectPlatformAuthenticator();
35
+ }
36
+ return this.platformAvailability;
37
+ }
38
+ getEnrollmentStatus() {
39
+ return firstValueFrom(this.httpClient.get('/api2/PassKey/0.1/status?v=' + getUniqueId(4))).then((response) => this.parseJsonResponse(response));
40
+ }
41
+ canOfferEnrollment(status) {
42
+ return status.canCreatePasskey ?? status.shouldOfferEnrollment;
43
+ }
44
+ isCredentialAlreadyRegistered(error) {
45
+ return (typeof error === 'object' &&
46
+ error !== null &&
47
+ 'name' in error &&
48
+ error.name === 'InvalidStateError');
49
+ }
50
+ async register() {
51
+ const ceremonyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/registrationoptions', {}));
52
+ const ceremony = this.parseJsonResponse(ceremonyResponse);
53
+ const publicKey = this.toCreationOptions(ceremony.publicKey);
54
+ const credential = (await navigator.credentials.create({ publicKey }));
55
+ if (!credential || !('attestationObject' in credential.response)) {
56
+ throw new Error('PASSKEY_REGISTRATION_EMPTY');
57
+ }
58
+ const verifyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/registrationverify', {
59
+ ceremonyId: ceremony.ceremonyId,
60
+ credential: this.serializeRegistrationCredential(credential)
61
+ }));
62
+ const response = this.parseJsonResponse(verifyResponse);
63
+ if (!response.verified) {
64
+ throw new Error('PASSKEY_REGISTRATION_REJECTED');
65
+ }
66
+ return response;
67
+ }
68
+ async authenticate() {
69
+ const ceremonyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/authenticationoptions', {}));
70
+ const ceremony = this.parseJsonResponse(ceremonyResponse);
71
+ const publicKey = this.toRequestOptions(ceremony.publicKey);
72
+ const credential = (await navigator.credentials.get({ publicKey }));
73
+ if (!credential || !('signature' in credential.response)) {
74
+ throw new Error('PASSKEY_AUTHENTICATION_EMPTY');
75
+ }
76
+ const verifyResponse = await firstValueFrom(this.httpClient.post('/api2/PassKey/0.1/authenticationverify', {
77
+ ceremonyId: ceremony.ceremonyId,
78
+ credential: this.serializeAuthenticationCredential(credential)
79
+ }));
80
+ const response = this.parseJsonResponse(verifyResponse);
81
+ if (!response.verified || !response.token2?.trim()) {
82
+ throw new Error('PASSKEY_AUTHENTICATION_REJECTED');
83
+ }
84
+ return response.token2;
85
+ }
86
+ getErrorMessage(error) {
87
+ if (error instanceof DOMException) {
88
+ if (error.name === 'NotAllowedError') {
89
+ return 'عملیات لغو شد یا Passkey معتبری روی این دستگاه پیدا نشد.';
90
+ }
91
+ if (error.name === 'InvalidStateError') {
92
+ return 'Passkey این دستگاه قبلاً برای حساب شما ثبت شده است.';
93
+ }
94
+ if (error.name === 'SecurityError') {
95
+ return 'تنظیمات دامنه یا ارتباط امن برای ورود با دستگاه معتبر نیست.';
96
+ }
97
+ }
98
+ if (error instanceof HttpErrorResponse) {
99
+ const serverMessage = error.error?.Message || error.error?.message || error.error?.error?.userMessage;
100
+ if (typeof serverMessage === 'string' && serverMessage) {
101
+ return serverMessage;
102
+ }
103
+ }
104
+ return 'انجام احراز هویت دستگاه ممکن نشد. می‌توانید از روش دیگری وارد شوید.';
105
+ }
106
+ async detectPlatformAuthenticator() {
107
+ if (typeof window === 'undefined' ||
108
+ !window.isSecureContext ||
109
+ typeof PublicKeyCredential === 'undefined' ||
110
+ typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== 'function') {
111
+ return false;
112
+ }
113
+ try {
114
+ return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
115
+ }
116
+ catch {
117
+ return false;
118
+ }
119
+ }
120
+ parseJsonResponse(response) {
121
+ let value = response;
122
+ for (let depth = 0; depth < 2 && typeof value === 'string'; depth++) {
123
+ value = JSON.parse(value);
124
+ }
125
+ return value;
126
+ }
127
+ toCreationOptions(options) {
128
+ return {
129
+ ...options,
130
+ challenge: decodeBase64Url(options.challenge),
131
+ user: {
132
+ ...options.user,
133
+ id: decodeBase64Url(options.user.id)
134
+ },
135
+ excludeCredentials: this.toCredentialDescriptors(options.excludeCredentials),
136
+ authenticatorSelection: {
137
+ ...options.authenticatorSelection,
138
+ authenticatorAttachment: 'platform',
139
+ residentKey: 'required',
140
+ requireResidentKey: true,
141
+ userVerification: 'required'
142
+ },
143
+ attestation: 'none',
144
+ hints: ['client-device']
145
+ };
146
+ }
147
+ toRequestOptions(options) {
148
+ return {
149
+ ...options,
150
+ challenge: decodeBase64Url(options.challenge),
151
+ allowCredentials: this.toCredentialDescriptors(options.allowCredentials),
152
+ userVerification: 'required',
153
+ hints: ['client-device']
154
+ };
155
+ }
156
+ toCredentialDescriptors(descriptors) {
157
+ return descriptors?.map((descriptor) => ({
158
+ ...descriptor,
159
+ id: decodeBase64Url(descriptor.id),
160
+ transports: descriptor.transports
161
+ }));
162
+ }
163
+ serializeRegistrationCredential(credential) {
164
+ const response = credential.response;
165
+ return {
166
+ id: credential.id,
167
+ rawId: encodeBase64Url(credential.rawId),
168
+ type: 'public-key',
169
+ authenticatorAttachment: this.getAuthenticatorAttachment(credential),
170
+ clientExtensionResults: credential.getClientExtensionResults(),
171
+ response: {
172
+ clientDataJSON: encodeBase64Url(response.clientDataJSON),
173
+ attestationObject: encodeBase64Url(response.attestationObject),
174
+ transports: response.getTransports?.() || []
175
+ }
176
+ };
177
+ }
178
+ serializeAuthenticationCredential(credential) {
179
+ const response = credential.response;
180
+ return {
181
+ id: credential.id,
182
+ rawId: encodeBase64Url(credential.rawId),
183
+ type: 'public-key',
184
+ authenticatorAttachment: this.getAuthenticatorAttachment(credential),
185
+ clientExtensionResults: credential.getClientExtensionResults(),
186
+ response: {
187
+ clientDataJSON: encodeBase64Url(response.clientDataJSON),
188
+ authenticatorData: encodeBase64Url(response.authenticatorData),
189
+ signature: encodeBase64Url(response.signature),
190
+ userHandle: response.userHandle ? encodeBase64Url(response.userHandle) : null
191
+ }
192
+ };
193
+ }
194
+ getAuthenticatorAttachment(credential) {
195
+ return (credential.authenticatorAttachment ??
196
+ null);
197
+ }
198
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
199
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyService, providedIn: 'root' }); }
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyService, decorators: [{
202
+ type: Injectable,
203
+ args: [{ providedIn: 'root' }]
204
+ }] });
205
+
13
206
  class LoginMobileController extends BaseController {
14
207
  /**
15
208
  *
@@ -102,7 +295,8 @@ class LoginUserPassController extends BaseController {
102
295
  class LoginVerificationController extends BaseController {
103
296
  constructor(view) {
104
297
  super(view);
105
- this.canVerify = signal(false, ...(ngDevMode ? [{ debugName: "canVerify" }] : /* istanbul ignore next */ []));
298
+ this.canVerify = signal(false, /* @ts-ignore */
299
+ ...(ngDevMode ? [{ debugName: "canVerify" }] : /* istanbul ignore next */ []));
106
300
  this._httpClient = view.injector.get(HttpClient);
107
301
  }
108
302
  get form() {
@@ -166,8 +360,10 @@ class EnterMobileComponent extends ViewBase {
166
360
  super();
167
361
  this.otpSent = new EventEmitter();
168
362
  this.controller = new LoginMobileController(this);
169
- this.loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
170
- this.isValid = signal(false, ...(ngDevMode ? [{ debugName: "isValid" }] : /* istanbul ignore next */ []));
363
+ this.loading = signal(false, /* @ts-ignore */
364
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
365
+ this.isValid = signal(false, /* @ts-ignore */
366
+ ...(ngDevMode ? [{ debugName: "isValid" }] : /* istanbul ignore next */ []));
171
367
  /** Inserted by Angular inject() migration for backwards compatibility */
172
368
  this.fb = inject(FormBuilder);
173
369
  this.form = this.fb.group({
@@ -203,12 +399,12 @@ class EnterMobileComponent extends ViewBase {
203
399
  onSendCode() {
204
400
  this.controller.sendCode(this.otpProvider, this.form.value);
205
401
  }
206
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: EnterMobileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
207
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: EnterMobileComponent, isStandalone: false, selector: "ba-enter-mobile", inputs: { errorTemplate: "errorTemplate", otpProvider: "otpProvider", mobileDescription: "mobileDescription", usernameDescription: "usernameDescription", usernameLabel: "usernameLabel" }, outputs: { otpSent: "otpSent" }, usesInheritance: true, ngImport: i0, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{usernameLabel}}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"tw-text-gray-500 tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{usernameLabel}} \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"tw-text-gray-500 tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">\u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
402
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
403
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: EnterMobileComponent, isStandalone: false, selector: "ba-enter-mobile", inputs: { errorTemplate: "errorTemplate", otpProvider: "otpProvider", mobileDescription: "mobileDescription", usernameDescription: "usernameDescription", usernameLabel: "usernameLabel" }, outputs: { otpSent: "otpSent" }, usesInheritance: true, ngImport: i0, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{ usernameLabel }}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{ usernameLabel }} \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">\u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
208
404
  }
209
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: EnterMobileComponent, decorators: [{
405
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, decorators: [{
210
406
  type: Component,
211
- args: [{ selector: 'ba-enter-mobile', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{usernameLabel}}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"tw-text-gray-500 tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{usernameLabel}} \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"tw-text-gray-500 tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">\u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n" }]
407
+ args: [{ selector: 'ba-enter-mobile', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mt-2\" [formGroup]=\"form\">\r\n @if(usernameLabel){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n {{ usernameLabel }}\r\n </label>\r\n @if(usernameDescription){\r\n <div [innerHtml]=\"usernameDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched) && username?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">{{ usernameLabel }} \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"tw-mb-4\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 </label>\r\n @if(mobileDescription){\r\n <div [innerHtml]=\"mobileDescription | sanitizeText\" class=\"auth-description tw-mb-4 tw-text-xs\"></div>\r\n }\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"mobile\"\r\n formControlName=\"mobile\"\r\n placeholder=\"09121234567\"\r\n maxlength=\"11\"\r\n type=\"tel\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"mobile.invalid && (mobile.dirty || mobile.touched) && mobile?.errors.length\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"mobile.errors?.['required']\">\u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n </div>\r\n\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F'\"\r\n [valid]=\"isValid()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"] }]
212
408
  }], ctorParameters: () => [], propDecorators: { otpSent: [{
213
409
  type: Output
214
410
  }], errorTemplate: [{
@@ -227,9 +423,12 @@ class TimerCountDownComponent extends BaseComponent {
227
423
  constructor() {
228
424
  super(...arguments);
229
425
  this.resend = new EventEmitter();
230
- this.showResend = signal(false, ...(ngDevMode ? [{ debugName: "showResend" }] : /* istanbul ignore next */ []));
231
- this.minutesText = signal('', ...(ngDevMode ? [{ debugName: "minutesText" }] : /* istanbul ignore next */ []));
232
- this.secondText = signal('', ...(ngDevMode ? [{ debugName: "secondText" }] : /* istanbul ignore next */ []));
426
+ this.showResend = signal(false, /* @ts-ignore */
427
+ ...(ngDevMode ? [{ debugName: "showResend" }] : /* istanbul ignore next */ []));
428
+ this.minutesText = signal('', /* @ts-ignore */
429
+ ...(ngDevMode ? [{ debugName: "minutesText" }] : /* istanbul ignore next */ []));
430
+ this.secondText = signal('', /* @ts-ignore */
431
+ ...(ngDevMode ? [{ debugName: "secondText" }] : /* istanbul ignore next */ []));
233
432
  }
234
433
  ngOnInit() {
235
434
  super.ngOnInit();
@@ -276,12 +475,12 @@ class TimerCountDownComponent extends BaseComponent {
276
475
  this.showResend.set(true);
277
476
  }
278
477
  }
279
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TimerCountDownComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
280
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TimerCountDownComponent, isStandalone: false, selector: "ba-timer-countdown", inputs: { minutes: "minutes", loading: "loading" }, outputs: { resend: "resend" }, usesInheritance: true, ngImport: i0, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n style=\"align-items: center; color: var(--button-loading)\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n", styles: [":host{display:block;width:10rem}:host ::ng-deep button{padding:4px!important}:host ::ng-deep .button__text{font-weight:400!important}\n"], dependencies: [{ kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
478
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
479
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: TimerCountDownComponent, isStandalone: false, selector: "ba-timer-countdown", inputs: { minutes: "minutes", loading: "loading" }, outputs: { resend: "resend" }, usesInheritance: true, ngImport: i0, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"auth-timer tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;width:10rem}:host ::ng-deep button{padding:4px!important}:host ::ng-deep .button__text{font-weight:400!important}.auth-timer{align-items:center;color:var(--sapButton_Emphasized_Background, #0a6ed1);font-family:var(--sapFontSemiboldDuplexFamily, var(--sapFontFamily, sans-serif))}\n"], dependencies: [{ kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
281
480
  }
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TimerCountDownComponent, decorators: [{
481
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, decorators: [{
283
482
  type: Component,
284
- args: [{ selector: 'ba-timer-countdown', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n style=\"align-items: center; color: var(--button-loading)\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n", styles: [":host{display:block;width:10rem}:host ::ng-deep button{padding:4px!important}:host ::ng-deep .button__text{font-weight:400!important}\n"] }]
483
+ args: [{ selector: 'ba-timer-countdown', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@if(showResend()){\r\n<bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u0627\u0631\u0633\u0627\u0644 \u0645\u062C\u062F\u062F'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading\"\r\n [transparent]=\"true\"\r\n (click)=\"resend.emit()\"\r\n></bnrc-button-loading>\r\n}@else{\r\n<div class=\"tw-text-center\">\r\n <div\r\n id=\"timer\"\r\n class=\"auth-timer tw-px-2 tw-flex tw-flex-row-reverse gap-2 tw-justify-center tw-uppercase\"\r\n [style.visibility]=\"minutesText() ? 'visible' : 'hidden'\"\r\n >\r\n <div>\r\n <span class=\"tw-text-xl\">{{ minutesText() }}</span>\r\n </div>\r\n <div class=\"tw-text-2xl\">:</div>\r\n <div>\r\n <span class=\"tw-text-xl\">{{ secondText() }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n}\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;width:10rem}:host ::ng-deep button{padding:4px!important}:host ::ng-deep .button__text{font-weight:400!important}.auth-timer{align-items:center;color:var(--sapButton_Emphasized_Background, #0a6ed1);font-family:var(--sapFontSemiboldDuplexFamily, var(--sapFontFamily, sans-serif))}\n"] }]
285
484
  }], propDecorators: { resend: [{
286
485
  type: Output
287
486
  }], minutes: [{
@@ -297,12 +496,17 @@ class VerificationComponent extends ViewBase {
297
496
  this.otpVerified = new EventEmitter();
298
497
  this.changeMobile = new EventEmitter();
299
498
  this.controller = new LoginVerificationController(this);
300
- this.capId = signal('-', ...(ngDevMode ? [{ debugName: "capId" }] : /* istanbul ignore next */ []));
301
- this.resendLoading = signal(false, ...(ngDevMode ? [{ debugName: "resendLoading" }] : /* istanbul ignore next */ []));
302
- this.loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
303
- this.showCaptcha = signal(false, ...(ngDevMode ? [{ debugName: "showCaptcha" }] : /* istanbul ignore next */ []));
499
+ this.capId = signal('-', /* @ts-ignore */
500
+ ...(ngDevMode ? [{ debugName: "capId" }] : /* istanbul ignore next */ []));
501
+ this.resendLoading = signal(false, /* @ts-ignore */
502
+ ...(ngDevMode ? [{ debugName: "resendLoading" }] : /* istanbul ignore next */ []));
503
+ this.loading = signal(false, /* @ts-ignore */
504
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
505
+ this.showCaptcha = signal(false, /* @ts-ignore */
506
+ ...(ngDevMode ? [{ debugName: "showCaptcha" }] : /* istanbul ignore next */ []));
304
507
  this._ngZone = inject(NgZone);
305
- this.now = signal(getUniqueId(3), ...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
508
+ this.now = signal(getUniqueId(3), /* @ts-ignore */
509
+ ...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
306
510
  this.fb = inject(FormBuilder);
307
511
  this.form = this.fb.group({
308
512
  in1: ['', Validators.compose([Validators.required, Validators.maxLength(6)])],
@@ -352,12 +556,12 @@ class VerificationComponent extends ViewBase {
352
556
  get canVerify() {
353
557
  return this.controller.canVerify();
354
558
  }
355
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: VerificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
356
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: VerificationComponent, isStandalone: false, selector: "ba-verification", inputs: { mobile: "mobile", otpProvider: "otpProvider", errorTemplate: "errorTemplate" }, outputs: { otpVerified: "otpVerified", changeMobile: "changeMobile" }, viewQueries: [{ propertyName: "_timerCountDown", first: true, predicate: TimerCountDownComponent, descendants: true }, { propertyName: "_loadingBtn", first: true, predicate: ["loadingBtn"], descendants: true }, { propertyName: "_inputsEl", predicate: ["inputv"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"tw-block tw-w-full tw-text-gray-500 tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n \u06A9\u062F \u0627\u0631\u0633\u0627\u0644 \u0634\u062F\u0647 \u0628\u0647 \u0634\u0645\u0627\u0631\u0647 <strong>{{ mobile }}</strong> \u0631\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0627\u06CC\u06CC\u062F.\r\n </label>\r\n <a\r\n class=\"tw-inline-flex tw-flex tw-gap-3 tw-cursor-pointer tw-items-center tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"#316bec\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div\r\n *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"in1.errors?.['required']\">\u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u062A\u0627\u06CC\u06CC\u062F \u06A9\u062F'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "directive", type: i3.WebOtpDirective, selector: "[appWebotp]", inputs: ["autoUpdate"], outputs: ["otpRecieved"] }, { kind: "component", type: TimerCountDownComponent, selector: "ba-timer-countdown", inputs: ["minutes", "loading"], outputs: ["resend"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
559
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
560
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: VerificationComponent, isStandalone: false, selector: "ba-verification", inputs: { mobile: "mobile", otpProvider: "otpProvider", errorTemplate: "errorTemplate" }, outputs: { otpVerified: "otpVerified", changeMobile: "changeMobile" }, viewQueries: [{ propertyName: "_timerCountDown", first: true, predicate: TimerCountDownComponent, descendants: true }, { propertyName: "_loadingBtn", first: true, predicate: ["loadingBtn"], descendants: true }, { propertyName: "_inputsEl", predicate: ["inputv"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"auth-label tw-block tw-w-full tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n \u06A9\u062F \u0627\u0631\u0633\u0627\u0644 \u0634\u062F\u0647 \u0628\u0647 \u0634\u0645\u0627\u0631\u0647 <strong>{{ mobile }}</strong> \u0631\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0627\u06CC\u06CC\u062F.\r\n </label>\r\n <a\r\n class=\"auth-link tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"auth-field tw-w-full\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\" class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\">\r\n <div *ngIf=\"in1.errors?.['required']\">\u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u062A\u0627\u06CC\u06CC\u062F \u06A9\u062F'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "directive", type: i3.WebOtpDirective, selector: "[appWebotp]", inputs: ["autoUpdate"], outputs: ["otpRecieved"] }, { kind: "component", type: TimerCountDownComponent, selector: "ba-timer-countdown", inputs: ["minutes", "loading"], outputs: ["resend"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
357
561
  }
358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: VerificationComponent, decorators: [{
562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, decorators: [{
359
563
  type: Component,
360
- args: [{ selector: 'ba-verification', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"tw-block tw-w-full tw-text-gray-500 tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n \u06A9\u062F \u0627\u0631\u0633\u0627\u0644 \u0634\u062F\u0647 \u0628\u0647 \u0634\u0645\u0627\u0631\u0647 <strong>{{ mobile }}</strong> \u0631\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0627\u06CC\u06CC\u062F.\r\n </label>\r\n <a\r\n class=\"tw-inline-flex tw-flex tw-gap-3 tw-cursor-pointer tw-items-center tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"#316bec\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div\r\n *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"in1.errors?.['required']\">\u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u062A\u0627\u06CC\u06CC\u062F \u06A9\u062F'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n" }]
564
+ args: [{ selector: 'ba-verification', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-pb-8 tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <label class=\"auth-label tw-block tw-w-full tw-text-md tw-font-bold tw-mb-4 tw-text-sm\">\r\n \u06A9\u062F \u0627\u0631\u0633\u0627\u0644 \u0634\u062F\u0647 \u0628\u0647 \u0634\u0645\u0627\u0631\u0647 <strong>{{ mobile }}</strong> \u0631\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0627\u06CC\u06CC\u062F.\r\n </label>\r\n <a\r\n class=\"auth-link tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium tw-mb-4\"\r\n (click)=\"changeMobile.emit()\"\r\n >\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tw-w-6\">\r\n <path\r\n d=\"M5,18H9.24a1,1,0,0,0,.71-.29l6.92-6.93h0L19.71,8a1,1,0,0,0,0-1.42L15.47,2.29a1,1,0,0,0-1.42,0L11.23,5.12h0L4.29,12.05a1,1,0,0,0-.29.71V17A1,1,0,0,0,5,18ZM14.76,4.41l2.83,2.83L16.17,8.66,13.34,5.83ZM6,13.17l5.93-5.93,2.83,2.83L8.83,16H6ZM21,20H3a1,1,0,0,0,0,2H21a1,1,0,0,0,0-2Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n </a>\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <input\r\n #inputv\r\n class=\"auth-field tw-w-full\"\r\n maxlength=\"6\"\r\n tabindex=\"0\"\r\n onkeypress=\"return event.charCode>=48 && event.charCode<=57\"\r\n name=\"in1\"\r\n [autoUpdate]=\"true\"\r\n appWebotp\r\n formControlName=\"in1\"\r\n />\r\n <ba-timer-countdown [minutes]=\"2\" (resend)=\"onResendOtp()\" [loading]=\"resendLoading()\"></ba-timer-countdown>\r\n </div>\r\n <div *ngIf=\"in1.invalid && (in1.dirty || in1.touched)\" class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\">\r\n <div *ngIf=\"in1.errors?.['required']\">\u06A9\u062F \u062A\u0627\u06CC\u06CC\u062F \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A</div>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-2\">\r\n <bnrc-button-loading\r\n #loadingBtn\r\n [text]=\"'\u062A\u0627\u06CC\u06CC\u062F \u06A9\u062F'\"\r\n [valid]=\"canVerify\"\r\n [loading]=\"loading()\"\r\n (click)=\"onVerifyCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <div\r\n class=\"auth-error tw-p-4 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"] }]
361
565
  }], ctorParameters: () => [], propDecorators: { _timerCountDown: [{
362
566
  type: ViewChild,
363
567
  args: [TimerCountDownComponent]
@@ -384,11 +588,16 @@ class UserPassComponent extends ViewBase {
384
588
  super();
385
589
  this.loggedIn = new EventEmitter();
386
590
  this.controller = new LoginUserPassController(this);
387
- this.canLogin = signal(false, ...(ngDevMode ? [{ debugName: "canLogin" }] : /* istanbul ignore next */ []));
388
- this.loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
389
- this.capId = signal(getUniqueId(4), ...(ngDevMode ? [{ debugName: "capId" }] : /* istanbul ignore next */ []));
390
- this.now = signal(getUniqueId(3), ...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
391
- this.showCaptcha = signal(false, ...(ngDevMode ? [{ debugName: "showCaptcha" }] : /* istanbul ignore next */ []));
591
+ this.canLogin = signal(false, /* @ts-ignore */
592
+ ...(ngDevMode ? [{ debugName: "canLogin" }] : /* istanbul ignore next */ []));
593
+ this.loading = signal(false, /* @ts-ignore */
594
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
595
+ this.capId = signal(getUniqueId(4), /* @ts-ignore */
596
+ ...(ngDevMode ? [{ debugName: "capId" }] : /* istanbul ignore next */ []));
597
+ this.now = signal(getUniqueId(3), /* @ts-ignore */
598
+ ...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
599
+ this.showCaptcha = signal(false, /* @ts-ignore */
600
+ ...(ngDevMode ? [{ debugName: "showCaptcha" }] : /* istanbul ignore next */ []));
392
601
  /** Inserted by Angular inject() migration for backwards compatibility */
393
602
  this.fb = inject(FormBuilder);
394
603
  this.form = this.fb.group({
@@ -435,12 +644,12 @@ class UserPassComponent extends ViewBase {
435
644
  validateAllFormFields(this.form);
436
645
  this.canLogin() && !this.loading() && this.controller.login(this.form.value);
437
646
  }
438
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UserPassComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
439
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: UserPassComponent, isStandalone: false, selector: "ba-user-pass", inputs: { errorTemplate: "errorTemplate", otpProvider: "otpProvider" }, outputs: { loggedIn: "loggedIn" }, usesInheritance: true, ngImport: i0, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC </label>\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 </label>\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-flex tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n \u0639\u0628\u0627\u0631\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC\r\n </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"tw-w-full tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\"/>\r\n <button\r\n class=\"btn btn-outline-primary btn-sm !tw-border-none tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content ></ng-content>\r\n <div\r\n class=\"tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [".btn-outline-primary:hover{background-color:transparent!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
647
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
648
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: UserPassComponent, isStandalone: false, selector: "ba-user-pass", inputs: { errorTemplate: "errorTemplate", otpProvider: "otpProvider" }, outputs: { loggedIn: "loggedIn" }, usesInheritance: true, ngImport: i0, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-flex tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0639\u0628\u0627\u0631\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\" />\r\n <button\r\n class=\"auth-captcha-refresh tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-captcha-refresh{padding:0;border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);cursor:pointer}.auth-captcha-refresh:hover:not(:disabled){border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.auth-captcha-refresh:active:not(:disabled){border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.auth-captcha-refresh:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-captcha-refresh:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }, { kind: "pipe", type: i3.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
440
649
  }
441
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UserPassComponent, decorators: [{
650
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, decorators: [{
442
651
  type: Component,
443
- args: [{ selector: 'ba-user-pass', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC </label>\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 </label>\r\n <input\r\n class=\"tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"tw-flex tw-block tw-text-gray-500 tw-text-md tw-font-bold tw-mb-2\" for=\"username\">\r\n \u0639\u0628\u0627\u0631\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC\r\n </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"tw-w-full tw-rounded-lg tw-border tw-w-full tw-py-2 tw-px-3 tw-text-gray-700 tw-leading-tight tw-focus:tw-outline-none tw-focus:tw-shadow-outline\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\"/>\r\n <button\r\n class=\"btn btn-outline-primary btn-sm !tw-border-none tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content ></ng-content>\r\n <div\r\n class=\"tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs tw-text-red-800 tw-rounded-lg tw-bg-red-50 dark:tw-bg-gray-800 dark:tw-text-red-400\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [".btn-outline-primary:hover{background-color:transparent!important}\n"] }]
652
+ args: [{ selector: 'ba-user-pass', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<form class=\"tw-mb-2 tw-mt-2\" [formGroup]=\"form\">\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"username\"\r\n formControlName=\"username\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"username.errors?.['required']\">\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 </label>\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"password\"\r\n formControlName=\"password\"\r\n placeholder=\"\"\r\n type=\"password\"\r\n [disabled]=\"loading()\"\r\n />\r\n <div\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n class=\"auth-error tw-p-2 tw-mb-2 tw-mt-2 tw-text-xs\"\r\n >\r\n <div *ngIf=\"password.errors?.['required']\">\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0636\u0631\u0648\u0631\u06CC \u0627\u0633\u062A.</div>\r\n </div>\r\n </div>\r\n @if(showCaptcha()){\r\n <div class=\"tw-mb-2\">\r\n <label class=\"auth-label tw-flex tw-block tw-text-md tw-font-bold tw-mb-2\" for=\"username\"> \u0639\u0628\u0627\u0631\u062A \u0627\u0645\u0646\u06CC\u062A\u06CC </label>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <input\r\n class=\"auth-field tw-w-full\"\r\n name=\"cap\"\r\n formControlName=\"cap\"\r\n placeholder=\"\"\r\n type=\"text\"\r\n [disabled]=\"loading()\"\r\n />\r\n <img class=\"tw-w-36\" [src]=\"'/api/auth/captcha?capId=' + capId() + '&t=' + now()\" loading=\"lazy\" />\r\n <button\r\n class=\"auth-captcha-refresh tw-w-12 tw-h-8 tw-flex tw-items-center tw-justify-center\"\r\n type=\"button\"\r\n [disabled]=\"loading()\"\r\n (click)=\"onRefreshCaptcha()\"\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"28\"\r\n height=\"28\"\r\n fill=\"currentColor\"\r\n class=\"bi bi-bootstrap-reboot\"\r\n viewBox=\"0 0 16 16\"\r\n >\r\n <path\r\n d=\"M1.161 8a6.84 6.84 0 1 0 6.842-6.84.58.58 0 1 1 0-1.16 8 8 0 1 1-6.556 3.412l-.663-.577a.58.58 0 0 1 .227-.997l2.52-.69a.58.58 0 0 1 .728.633l-.332 2.592a.58.58 0 0 1-.956.364l-.643-.56A6.8 6.8 0 0 0 1.16 8z\"\r\n ></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n <!-- <app-form-captcha [capId]=\"capId()\" [showCaptcha]=\"showCaptcha()\" formControlName=\"cap\"></app-form-captcha> -->\r\n <div class=\"tw-flex tw-items-center tw-mb-4 tw-mt-8\">\r\n <bnrc-button-loading\r\n [text]=\"'Login' | bbbTranslate\"\r\n [valid]=\"canLogin()\"\r\n [loading]=\"loading()\"\r\n (click)=\"onSendCode()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n <ng-content></ng-content>\r\n <div\r\n class=\"auth-error tw-p-2 tw-mb-4 tw-mt-2 tw-text-xs\"\r\n [style.visibility]=\"errorMessage() ? 'visible' : 'hidden'\"\r\n role=\"alert\"\r\n >\r\n <span class=\"tw-font-medium\">{{ 'Error' | bbbTranslate }}!</span> {{ errorMessage() }}\r\n </div>\r\n</form>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif));font-size:var(--sapFontSize, .875rem);font-weight:600}.auth-field{box-sizing:border-box;min-height:var(--sapElement_Height, 2.75rem);padding-block:.5rem;padding-inline:.75rem;border:var(--sapField_BorderWidth, .0625rem) var(--sapField_BorderStyle, solid) var(--sapField_BorderColor, #89919a);border-radius:var(--sapField_BorderCornerRadius, .5rem);color:var(--sapField_TextColor, #32363a);background:var(--sapField_Background, #fff);caret-color:var(--sapField_TextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);line-height:normal;transition:border-color .12s ease,background-color .12s ease,outline-color .12s ease}.auth-field::placeholder{color:var(--sapField_PlaceholderTextColor, #74777a)}.auth-field:hover:not(:disabled){border-color:var(--sapField_Hover_BorderColor, #0854a0);background:var(--sapField_Hover_Background, #fff)}.auth-field:focus{border-color:var(--sapField_Focus_BorderColor, #0854a0);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem;background:var(--sapField_Focus_Background, #fff);color:var(--sapField_Focus_TextColor, var(--sapField_TextColor, #32363a))}.auth-field:disabled{border-color:var(--sapField_ReadOnly_BorderColor, var(--sapField_BorderColor, #89919a));background:var(--sapField_ReadOnly_Background, #f2f2f2);color:var(--sapContent_DisabledTextColor, #6a6d70);cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-captcha-refresh{padding:0;border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);cursor:pointer}.auth-captcha-refresh:hover:not(:disabled){border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.auth-captcha-refresh:active:not(:disabled){border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.auth-captcha-refresh:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-captcha-refresh:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}\n"] }]
444
653
  }], ctorParameters: () => [], propDecorators: { loggedIn: [{
445
654
  type: Output
446
655
  }], errorTemplate: [{
@@ -449,18 +658,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
449
658
  type: Input
450
659
  }] } });
451
660
 
661
+ class PasskeyComponent {
662
+ constructor() {
663
+ this.mode = 'login';
664
+ this.autoStart = false;
665
+ this.loggedIn = new EventEmitter();
666
+ this.registered = new EventEmitter();
667
+ this.skipped = new EventEmitter();
668
+ this.cancelled = new EventEmitter();
669
+ this.checkingSupport = signal(true, /* @ts-ignore */
670
+ ...(ngDevMode ? [{ debugName: "checkingSupport" }] : /* istanbul ignore next */ []));
671
+ this.supported = signal(false, /* @ts-ignore */
672
+ ...(ngDevMode ? [{ debugName: "supported" }] : /* istanbul ignore next */ []));
673
+ this.loading = signal(false, /* @ts-ignore */
674
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
675
+ this.errorMessage = signal('', /* @ts-ignore */
676
+ ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
677
+ this.passkeyService = inject(PasskeyService);
678
+ }
679
+ ngOnInit() {
680
+ void this.checkSupport();
681
+ }
682
+ async onPrimaryAction() {
683
+ if (!this.supported() || this.loading()) {
684
+ return;
685
+ }
686
+ this.loading.set(true);
687
+ this.errorMessage.set('');
688
+ try {
689
+ if (this.mode === 'enrollment') {
690
+ await this.passkeyService.register();
691
+ this.registered.emit();
692
+ }
693
+ else {
694
+ const token2 = await this.passkeyService.authenticate();
695
+ this.loggedIn.emit(token2);
696
+ }
697
+ }
698
+ catch (error) {
699
+ if (this.mode === 'enrollment' && this.passkeyService.isCredentialAlreadyRegistered(error)) {
700
+ // excludeCredentials نشان می‌دهد Passkey روی authenticator جاری از قبل موجود است.
701
+ this.registered.emit();
702
+ return;
703
+ }
704
+ console.error('Passkey error:', error);
705
+ if (error instanceof DOMException) {
706
+ console.error('name:', error.name);
707
+ console.error('message:', error.message);
708
+ }
709
+ this.errorMessage.set(this.passkeyService.getErrorMessage(error));
710
+ }
711
+ finally {
712
+ this.loading.set(false);
713
+ }
714
+ }
715
+ onSkip() {
716
+ if (this.loading()) {
717
+ return;
718
+ }
719
+ this.skipped.emit();
720
+ }
721
+ async checkSupport() {
722
+ const supported = await this.passkeyService.isPlatformAuthenticatorAvailable();
723
+ this.supported.set(supported);
724
+ this.checkingSupport.set(false);
725
+ if (supported && this.mode === 'login' && this.autoStart) {
726
+ await this.onPrimaryAction();
727
+ }
728
+ }
729
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
730
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: PasskeyComponent, isStandalone: false, selector: "ba-passkey", inputs: { mode: "mode", autoStart: "autoStart" }, outputs: { loggedIn: "loggedIn", registered: "registered", skipped: "skipped", cancelled: "cancelled" }, ngImport: i0, template: "<section class=\"passkey-panel tw-mt-2\" [attr.aria-busy]=\"loading()\">\r\n @if (mode === 'enrollment') {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0633\u0631\u06CC\u0639 \u0628\u0627 \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0628\u0627 \u062B\u0628\u062A Passkey\u060C \u062F\u0641\u0639\u0647\u200C\u06CC \u0628\u0639\u062F \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u06CC\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647 \u0648\u0627\u0631\u062F \u0634\u0648\u06CC\u062F. \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0648\u0645\u062A\u0631\u06CC\u06A9 \u0648 PIN \u0627\u0632\r\n \u062F\u0633\u062A\u06AF\u0627\u0647 \u062E\u0627\u0631\u062C \u0646\u0645\u06CC\u200C\u0634\u0648\u0646\u062F.\r\n </p>\r\n } @else {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0627\u0632 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0628\u0631\u0627\u06CC \u0648\u0631\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F.\r\n </p>\r\n } @if (checkingSupport()) {\r\n <p class=\"passkey-description tw-text-sm tw-mb-4\">\u062F\u0631 \u062D\u0627\u0644 \u0628\u0631\u0631\u0633\u06CC \u0642\u0627\u0628\u0644\u06CC\u062A \u062F\u0633\u062A\u06AF\u0627\u0647...</p>\r\n } @else if (supported()) {\r\n <div class=\"tw-flex tw-items-center tw-mb-4\">\r\n <bnrc-button-loading\r\n [text]=\"mode === 'enrollment' ? '\u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC \u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647' : '\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading()\"\r\n (click)=\"onPrimaryAction()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n } @else {\r\n <p class=\"auth-error tw-p-3 tw-mb-4 tw-text-xs\" role=\"status\">\r\n \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u062F\u0627\u062E\u0644\u06CC \u0631\u0648\u06CC \u0627\u06CC\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631 \u06CC\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.\r\n </p>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-4 tw-items-center\">\r\n @if (mode === 'enrollment') {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"onSkip()\">\u0641\u0639\u0644\u0627\u064B \u0646\u0647</button>\r\n } @else {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"cancelled.emit()\">\r\n \u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0631\u0648\u0634\u200C\u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"auth-error tw-p-3 tw-mb-4 tw-mt-4 tw-text-xs\" role=\"alert\">\r\n <span class=\"tw-font-medium\">\u062E\u0637\u0627!</span> {{ errorMessage() }}\r\n </div>\r\n }\r\n</section>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.passkey-panel{color:var(--sapTextColor, #32363a)}.passkey-title{color:var(--sapTitleColor, var(--sapTextColor, #32363a));font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif))}.passkey-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem);line-height:1.75}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-link{padding:0;border:0;background:transparent}.passkey-link:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"], dependencies: [{ kind: "component", type: i3.ButtonLoadingComponent, selector: "bnrc-button-loading", inputs: ["valid", "loading", "text", "transparent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
731
+ }
732
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PasskeyComponent, decorators: [{
733
+ type: Component,
734
+ args: [{ selector: 'ba-passkey', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<section class=\"passkey-panel tw-mt-2\" [attr.aria-busy]=\"loading()\">\r\n @if (mode === 'enrollment') {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0633\u0631\u06CC\u0639 \u0628\u0627 \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0628\u0627 \u062B\u0628\u062A Passkey\u060C \u062F\u0641\u0639\u0647\u200C\u06CC \u0628\u0639\u062F \u0645\u06CC\u200C\u062A\u0648\u0627\u0646\u06CC\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647 \u0648\u0627\u0631\u062F \u0634\u0648\u06CC\u062F. \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0648\u0645\u062A\u0631\u06CC\u06A9 \u0648 PIN \u0627\u0632\r\n \u062F\u0633\u062A\u06AF\u0627\u0647 \u062E\u0627\u0631\u062C \u0646\u0645\u06CC\u200C\u0634\u0648\u0646\u062F.\r\n </p>\r\n } @else {\r\n <h3 class=\"passkey-title tw-text-lg tw-font-semibold tw-mb-2\">\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647</h3>\r\n <p class=\"passkey-description tw-text-sm tw-mb-5\">\r\n \u0627\u0632 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u062A\u0634\u062E\u06CC\u0635 \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0628\u0631\u0627\u06CC \u0648\u0631\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F.\r\n </p>\r\n } @if (checkingSupport()) {\r\n <p class=\"passkey-description tw-text-sm tw-mb-4\">\u062F\u0631 \u062D\u0627\u0644 \u0628\u0631\u0631\u0633\u06CC \u0642\u0627\u0628\u0644\u06CC\u062A \u062F\u0633\u062A\u06AF\u0627\u0647...</p>\r\n } @else if (supported()) {\r\n <div class=\"tw-flex tw-items-center tw-mb-4\">\r\n <bnrc-button-loading\r\n [text]=\"mode === 'enrollment' ? '\u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC \u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647' : '\u0648\u0631\u0648\u062F \u0628\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647'\"\r\n [valid]=\"true\"\r\n [loading]=\"loading()\"\r\n (click)=\"onPrimaryAction()\"\r\n ></bnrc-button-loading>\r\n </div>\r\n } @else {\r\n <p class=\"auth-error tw-p-3 tw-mb-4 tw-text-xs\" role=\"status\">\r\n \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u062F\u0627\u062E\u0644\u06CC \u0631\u0648\u06CC \u0627\u06CC\u0646 \u0645\u0631\u0648\u0631\u06AF\u0631 \u06CC\u0627 \u062F\u0633\u062A\u06AF\u0627\u0647 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.\r\n </p>\r\n }\r\n\r\n <div class=\"tw-flex tw-gap-4 tw-items-center\">\r\n @if (mode === 'enrollment') {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"onSkip()\">\u0641\u0639\u0644\u0627\u064B \u0646\u0647</button>\r\n } @else {\r\n <button type=\"button\" class=\"auth-link passkey-link\" [disabled]=\"loading()\" (click)=\"cancelled.emit()\">\r\n \u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0631\u0648\u0634\u200C\u0647\u0627\u06CC \u062F\u06CC\u06AF\u0631\r\n </button>\r\n }\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"auth-error tw-p-3 tw-mb-4 tw-mt-4 tw-text-xs\" role=\"alert\">\r\n <span class=\"tw-font-medium\">\u062E\u0637\u0627!</span> {{ errorMessage() }}\r\n </div>\r\n }\r\n</section>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.passkey-panel{color:var(--sapTextColor, #32363a)}.passkey-title{color:var(--sapTitleColor, var(--sapTextColor, #32363a));font-family:var(--sapFontSemiboldFamily, var(--sapFontFamily, sans-serif))}.passkey-description{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem);line-height:1.75}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-link{padding:0;border:0;background:transparent}.passkey-link:disabled{cursor:not-allowed;opacity:var(--sapContent_DisabledOpacity, .5)}.auth-error{border:.0625rem solid var(--sapErrorBorderColor, #bb0000);border-radius:var(--sapElement_BorderCornerRadius, .5rem);color:var(--sapNegativeTextColor, var(--sapNegativeColor, #bb0000));background:var(--sapErrorBackground, #ffebeb);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}\n"] }]
735
+ }], propDecorators: { mode: [{
736
+ type: Input
737
+ }], autoStart: [{
738
+ type: Input
739
+ }], loggedIn: [{
740
+ type: Output
741
+ }], registered: [{
742
+ type: Output
743
+ }], skipped: [{
744
+ type: Output
745
+ }], cancelled: [{
746
+ type: Output
747
+ }] } });
748
+
452
749
  class BarsaAuthComponent {
453
750
  constructor() {
454
751
  this.verified = new EventEmitter();
455
- this.appSettings = input.required(...(ngDevMode ? [{ debugName: "appSettings" }] : /* istanbul ignore next */ []));
456
- this.state = signal('enter-mobile', ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
457
- this.mobile = signal('', ...(ngDevMode ? [{ debugName: "mobile" }] : /* istanbul ignore next */ []));
458
- this.loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
752
+ this.appSettings = input.required(/* @ts-ignore */
753
+ ...(ngDevMode ? [{ debugName: "appSettings" }] : /* istanbul ignore next */ []));
754
+ this.state = signal('enter-mobile', /* @ts-ignore */
755
+ ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
756
+ this.mobile = signal('', /* @ts-ignore */
757
+ ...(ngDevMode ? [{ debugName: "mobile" }] : /* istanbul ignore next */ []));
758
+ this.loading = signal(false, /* @ts-ignore */
759
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
760
+ this.passkeyAvailable = signal(false, /* @ts-ignore */
761
+ ...(ngDevMode ? [{ debugName: "passkeyAvailable" }] : /* istanbul ignore next */ []));
459
762
  this._portalService = inject(PortalService);
460
763
  this._applicationCtrlrService = inject(ApplicationCtrlrService);
764
+ this.passkeyService = inject(PasskeyService);
461
765
  }
462
766
  ngOnInit() {
463
767
  this.state.set(this.appSettings().DefaultState || 'enter-mobile');
768
+ if (this.appSettings().PasskeyEnable) {
769
+ void this.updatePasskeyAvailability();
770
+ }
464
771
  }
465
772
  onChangeState(state) {
466
773
  this.state.set(state);
@@ -473,15 +780,47 @@ class BarsaAuthComponent {
473
780
  this.state.set('verification');
474
781
  }
475
782
  onLoggedIn() {
783
+ void this.completeExistingLogin();
784
+ }
785
+ onPasskeyLoggedIn(token2) {
786
+ this.finishLogin(token2);
787
+ }
788
+ onEnrollmentFinished() {
789
+ this.finishLogin();
790
+ }
791
+ async updatePasskeyAvailability() {
792
+ this.passkeyAvailable.set(await this.passkeyService.isPlatformAuthenticatorAvailable());
793
+ }
794
+ async completeExistingLogin() {
476
795
  this.loading.set(true);
477
- this.verified.emit();
796
+ if (this.appSettings().PasskeyEnable &&
797
+ this.appSettings().PasskeyPromptOnFirstLogin &&
798
+ (await this.passkeyService.isPlatformAuthenticatorAvailable())) {
799
+ try {
800
+ const status = await this.passkeyService.getEnrollmentStatus();
801
+ if (this.passkeyService.canOfferEnrollment(status)) {
802
+ this.loading.set(false);
803
+ this.state.set('passkey-enrollment');
804
+ return;
805
+ }
806
+ }
807
+ catch (e) {
808
+ console.error('Error checking passkey enrollment status:', e);
809
+ // Passkey اختیاری است؛ خطای status نباید ورود موفق را متوقف کند.
810
+ }
811
+ }
812
+ this.finishLogin();
478
813
  }
479
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BarsaAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
480
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: BarsaAuthComponent, isStandalone: false, selector: "ba-auth", inputs: { appSettings: { classPropertyName: "appSettings", publicName: "appSettings", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { verified: "verified" }, ngImport: i0, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-mb-4 tw-cursor-pointer\"\r\n (click)=\"onChangeState('user-pass')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\r\n </a>\r\n }\r\n </div>\r\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer tw-flex tw-justify-between\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-mb-4 tw-cursor-pointer\"\r\n (click)=\"onChangeState('enter-mobile')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n </a>\r\n }\r\n </div>\r\n </ba-user-pass>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"tw-flex-grow tw-border-t tw-border-gray-400\"></div>\r\n <span class=\"tw-font-[IRANYekan] tw-flex-shrink tw-mx-4 tw-text-gray-400\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"tw-flex-grow tw-border-t tw-border-gray-400\"></div>\r\n </div>\r\n <div class=\"tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a\r\n class=\"tw-w-full tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-cursor-pointer\"\r\n [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.MobileDirective, selector: "[mobile]" }, { kind: "component", type: EnterMobileComponent, selector: "ba-enter-mobile", inputs: ["errorTemplate", "otpProvider", "mobileDescription", "usernameDescription", "usernameLabel"], outputs: ["otpSent"] }, { kind: "component", type: VerificationComponent, selector: "ba-verification", inputs: ["mobile", "otpProvider", "errorTemplate"], outputs: ["otpVerified", "changeMobile"] }, { kind: "component", type: UserPassComponent, selector: "ba-user-pass", inputs: ["errorTemplate", "otpProvider"], outputs: ["loggedIn"] }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }] }); }
814
+ finishLogin(token2) {
815
+ this.loading.set(false);
816
+ this.verified.emit(token2);
817
+ }
818
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
819
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: BarsaAuthComponent, isStandalone: false, selector: "ba-auth", inputs: { appSettings: { classPropertyName: "appSettings", publicName: "appSettings", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { verified: "verified" }, ngImport: i0, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.MobileDirective, selector: "[mobile]" }, { kind: "component", type: EnterMobileComponent, selector: "ba-enter-mobile", inputs: ["errorTemplate", "otpProvider", "mobileDescription", "usernameDescription", "usernameLabel"], outputs: ["otpSent"] }, { kind: "component", type: VerificationComponent, selector: "ba-verification", inputs: ["mobile", "otpProvider", "errorTemplate"], outputs: ["otpVerified", "changeMobile"] }, { kind: "component", type: UserPassComponent, selector: "ba-user-pass", inputs: ["errorTemplate", "otpProvider"], outputs: ["loggedIn"] }, { kind: "component", type: PasskeyComponent, selector: "ba-passkey", inputs: ["mode", "autoStart"], outputs: ["loggedIn", "registered", "skipped", "cancelled"] }, { kind: "pipe", type: i3.SanitizeTextPipe, name: "sanitizeText" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
481
820
  }
482
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BarsaAuthComponent, decorators: [{
821
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, decorators: [{
483
822
  type: Component,
484
- args: [{ selector: 'ba-auth', standalone: false, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-mb-4 tw-cursor-pointer\"\r\n (click)=\"onChangeState('user-pass')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\r\n </a>\r\n }\r\n </div>\r\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer tw-flex tw-justify-between\">\r\n @if(appSettings.UserPassEnable){\r\n <a\r\n class=\"tw-inline-flex tw-flex tw-gap-3 tw-items-center tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-mb-4 tw-cursor-pointer\"\r\n (click)=\"onChangeState('enter-mobile')\"\r\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\r\n </a>\r\n }\r\n </div>\r\n </ba-user-pass>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"tw-flex-grow tw-border-t tw-border-gray-400\"></div>\r\n <span class=\"tw-font-[IRANYekan] tw-flex-shrink tw-mx-4 tw-text-gray-400\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"tw-flex-grow tw-border-t tw-border-gray-400\"></div>\r\n </div>\r\n <div class=\"tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a\r\n class=\"tw-w-full tw-text-blue-600 tw-visited:tw-text-purple-600 tw-text-sm tw-font-medium tw-cursor-pointer\"\r\n [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n" }]
823
+ args: [{ selector: 'ba-auth', changeDetection: ChangeDetectionStrategy.Eager, standalone: false, template: "<ng-container\r\n *ngTemplateOutlet=\"appSettings() ? renderUi : missAppSettings; context: { $implicit: appSettings() }\"\r\n></ng-container>\r\n<ng-template #missAppSettings> Oops! </ng-template>\r\n<ng-template #renderUi let-appSettings>\r\n <div>\r\n @switch (state()) { @case ('enter-mobile') {\r\n <ba-enter-mobile\r\n (otpSent)=\"onOtpSent($event)\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n [mobileDescription]=\"appSettings.MobileDescription\"\r\n [usernameDescription]=\"appSettings.UsernameDescription\"\r\n [usernameLabel]=\"appSettings.UsernameLabel\"\r\n >\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('user-pass')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-enter-mobile>\r\n } @case ('verification') {\r\n <ba-verification\r\n [mobile]=\"mobile()\"\r\n [otpProvider]=\"appSettings.OtpProvider\"\r\n (changeMobile)=\"onChangeMobile()\"\r\n (otpVerified)=\"onLoggedIn()\"\r\n ></ba-verification>\r\n } @case ('user-pass') {\r\n <ba-user-pass (loggedIn)=\"onLoggedIn()\">\r\n <div class=\"form-footer\">\n @if(appSettings.UserPassEnable){\n <a\n class=\"auth-link tw-inline-flex tw-gap-3 tw-items-center tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('enter-mobile')\"\n >\u0648\u0631\u0648\u062F \u0628\u0627 \u0634\u0645\u0627\u0631\u0647 \u0647\u0645\u0631\u0627\u0647\n </a>\n } @if(appSettings.PasskeyEnable && passkeyAvailable()){\n <div class=\"passkey-entry tw-mt-5\">\n <button\n type=\"button\"\n class=\"passkey-entry-button tw-w-full tw-px-4 tw-py-3 tw-text-sm tw-font-medium\"\n (click)=\"onChangeState('passkey')\"\n >\n \u0648\u0631\u0648\u062F \u0628\u0627 \u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A\u060C \u0686\u0647\u0631\u0647 \u06CC\u0627 PIN \u062F\u0633\u062A\u06AF\u0627\u0647\n </button>\n </div>\n }\n </div>\n </ba-user-pass>\n } @case ('passkey') {\n <ba-passkey\n mode=\"login\"\n [autoStart]=\"true\"\n (loggedIn)=\"onPasskeyLoggedIn($event)\"\n (cancelled)=\"onChangeState('enter-mobile')\"\n >\n </ba-passkey>\n } @case ('passkey-enrollment') {\r\n <ba-passkey\r\n mode=\"enrollment\"\r\n (registered)=\"onEnrollmentFinished()\"\r\n (skipped)=\"onEnrollmentFinished()\"\r\n ></ba-passkey>\r\n } }\r\n </div>\r\n <div class=\"tw-absolute tw-left-0 tw-right-0 tw-bottom-0 tw-pb-safe\">\r\n @if(appSettings.LoginFooter){\r\n <div [innerHTML]=\"appSettings.LoginFooter | sanitizeText\"></div>\r\n } @if(state()!=='verification' && state()!=='passkey-enrollment' && !appSettings.HideGovSso){\r\n <div class=\"tw-relative tw-flex tw-py-3 tw-items-center tw-px-2\">\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n <span class=\"auth-divider-label tw-flex-shrink tw-mx-4\">\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647</span>\r\n <div class=\"auth-divider tw-flex-grow\"></div>\r\n </div>\r\n <div class=\"auth-gov-entry tw-rounded-lg back-box-color tw-w-full tw-py-3\">\r\n <div class=\"tw-flex tw-items-center tw-text-center\">\r\n <a class=\"auth-link tw-w-full tw-text-sm tw-font-medium\" [attr.href]=\"appSettings.GovSSOHref\"\r\n >\u0648\u0631\u0648\u062F \u0627\u0632 \u0637\u0631\u06CC\u0642 \u062F\u0631\u06AF\u0627\u0647 \u062F\u0648\u0644\u062A \u0645\u0646\r\n </a>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.passkey-entry-button{border:var(--sapButton_BorderWidth, .0625rem) var(--sapButton_BorderStyle, solid) var(--sapButton_BorderColor, #0854a0);border-radius:var(--sapButton_BorderCornerRadius, .25rem);color:var(--sapButton_TextColor, #0854a0);background:var(--sapButton_Background, #fff);font-family:var(--sapFontFamily, sans-serif);cursor:pointer}.passkey-entry-button:hover{border-color:var(--sapButton_Hover_BorderColor, #0854a0);color:var(--sapButton_Hover_TextColor, #0854a0);background:var(--sapButton_Hover_Background, #ebf5fe)}.passkey-entry-button:active{border-color:var(--sapButton_Active_BorderColor, #0854a0);color:var(--sapButton_Active_TextColor, #fff);background:var(--sapButton_Active_Background, #0854a0)}.passkey-entry-button:focus-visible{outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.auth-divider{border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-divider-label{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSmallSize, .75rem)}.auth-gov-entry{border:var(--sapList_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, var(--sapList_BorderColor, #d9d9d9));background:var(--sapList_Background, var(--sapGroup_ContentBackground, #fff))}\n"] }]
485
824
  }], propDecorators: { verified: [{
486
825
  type: Output
487
826
  }], appSettings: [{ type: i0.Input, args: [{ isSignal: true, alias: "appSettings", required: true }] }] } });
@@ -505,7 +844,8 @@ class LoginComponent {
505
844
  MobileDescription: '',
506
845
  UsernameDescription: '',
507
846
  LoginFooter: ''
508
- }, ...(ngDevMode ? [{ debugName: "appSettings" }] : /* istanbul ignore next */ []));
847
+ }, /* @ts-ignore */
848
+ ...(ngDevMode ? [{ debugName: "appSettings" }] : /* istanbul ignore next */ []));
509
849
  this.logoUrl = '';
510
850
  this.backgroundUrl = '';
511
851
  this.title = '';
@@ -522,15 +862,21 @@ class LoginComponent {
522
862
  this.appSettings.set(resolverData.loginSettings);
523
863
  }
524
864
  }
525
- onVerified() {
865
+ onVerified(token2) {
866
+ if (token2) {
867
+ const currentUrl = new URL(window.location.origin);
868
+ currentUrl.searchParams.set('token2', token2);
869
+ window.location.href = currentUrl.toString();
870
+ return;
871
+ }
526
872
  window.location.href = window.location.origin;
527
873
  }
528
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
529
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: LoginComponent, isStandalone: false, selector: "ba-login", viewQueries: [{ propertyName: "_errorTemplate", first: true, predicate: ["template"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"tw-w-full md:tw-w-4/12 tw-relative tw-bg-white tw-shadow-sm tw-border\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n\r\n <hr class=\"tw-border tw-border-gray-300 tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"tw-text-blue-600 hover:tw-underline tw-pt-2 tw-cursor-pointer\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"tw-bg-white dark:tw-bg-gray-900 tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"tw-flex tw-items-center tw-h-full tw-px-20 tw-bg-gray-900 tw-bg-opacity-40\">\r\n <div>\r\n <h2 class=\"tw-text-4xl tw-font-bold tw-text-white\">{{ appSettings().Section1Title }}</h2>\r\n <p class=\"tw-max-w-xl tw-mt-3 tw-text-gray-300\">{{ appSettings().Section1Description }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"tw-text-2xl tw-font-bold tw-text-center tw-text-gray-700 dark:tw-text-white\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"tw-text-xl tw-mt-1 tw-text-gray-500 dark:tw-text-gray-300\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{font-family:IRANYekanDigits}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BarsaAuthComponent, selector: "ba-auth", inputs: ["appSettings"], outputs: ["verified"] }, { kind: "pipe", type: i3.PictureFieldSourcePipe, name: "picFieldSrc" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
874
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
875
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: LoginComponent, isStandalone: false, selector: "ba-login", viewQueries: [{ propertyName: "_errorTemplate", first: true, predicate: ["template"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"login-page tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"login-panel tw-w-full md:tw-w-4/12 tw-relative tw-shadow-sm\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n\r\n <hr class=\"login-divider tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"auth-link tw-pt-2\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"login-page tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"login-hero-overlay tw-flex tw-items-center tw-h-full tw-px-20\">\r\n <div>\r\n <h2 class=\"login-hero-title tw-text-4xl tw-font-bold\">\r\n {{ appSettings().Section1Title }}\r\n </h2>\r\n <p class=\"login-hero-description tw-max-w-xl tw-mt-3\">\r\n {{ appSettings().Section1Description }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"login-title tw-text-2xl tw-font-bold tw-text-center\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"login-subtitle tw-text-xl tw-mt-1\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;min-height:100%}.login-section,.login-page{color:var(--sapTextColor, #32363a);background:var(--sapBackgroundColor, #f7f7f7)}.login-panel{border:var(--sapElement_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, #d9d9d9);color:var(--sapTextColor, #32363a);background:var(--sapGroup_ContentBackground, #fff);box-shadow:var(--sapContent_Shadow1, 0 .125rem .5rem rgba(0, 0, 0, .2))}.login-divider{border:0;border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.login-hero-overlay{background:color-mix(in srgb,var(--sapShell_Background, #354a5f) 72%,transparent)}.login-hero-title{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-hero-description{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontFamily, sans-serif);opacity:.82}.login-title{color:var(--sapTitleColor, #32363a);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-subtitle{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif)}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BarsaAuthComponent, selector: "ba-auth", inputs: ["appSettings"], outputs: ["verified"] }, { kind: "pipe", type: i3.PictureFieldSourcePipe, name: "picFieldSrc" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
530
876
  }
531
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: LoginComponent, decorators: [{
877
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, decorators: [{
532
878
  type: Component,
533
- args: [{ selector: 'ba-login', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"tw-w-full md:tw-w-4/12 tw-relative tw-bg-white tw-shadow-sm tw-border\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n\r\n <hr class=\"tw-border tw-border-gray-300 tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"tw-text-blue-600 hover:tw-underline tw-pt-2 tw-cursor-pointer\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"tw-bg-white dark:tw-bg-gray-900 tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"tw-flex tw-items-center tw-h-full tw-px-20 tw-bg-gray-900 tw-bg-opacity-40\">\r\n <div>\r\n <h2 class=\"tw-text-4xl tw-font-bold tw-text-white\">{{ appSettings().Section1Title }}</h2>\r\n <p class=\"tw-max-w-xl tw-mt-3 tw-text-gray-300\">{{ appSettings().Section1Description }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"tw-text-2xl tw-font-bold tw-text-center tw-text-gray-700 dark:tw-text-white\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"tw-text-xl tw-mt-1 tw-text-gray-500 dark:tw-text-gray-300\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified()\"></ba-auth>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{font-family:IRANYekanDigits}\n"] }]
879
+ args: [{ selector: 'ba-login', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@switch (appSettings().Theme$Caption) { @case ('Side') {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} @case ('Center') {\r\n<ng-container *ngTemplateOutlet=\"center\"></ng-container>\r\n} @default {\r\n<ng-container *ngTemplateOutlet=\"side\"></ng-container>\r\n} }\r\n<ng-template #center>\r\n <div class=\"login-page tw-h-screen tw-flex tw-justify-center tw-items-center\">\r\n <section class=\"login-section tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-container tw-mx-auto\">\r\n <div class=\"tw-bg-transparent tw-border-0\">\r\n <div class=\"tw-flex tw-flex-col md:tw-flex-row rtl:tw-flex-row-reverse\">\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n\r\n <div class=\"tw-hidden md:tw-block md:tw-w-6/12 tw-shadow-sm\">\r\n <img\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-s\"\r\n loading=\"lazy\"\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/right-pic.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n\r\n <div class=\"login-panel tw-w-full md:tw-w-4/12 tw-relative tw-shadow-sm\">\r\n <div class=\"tw-p-3 md:tw-p-4 xl:tw-p-5\">\r\n <div class=\"tw-mb-3 tw-text-center\">\r\n <a href=\"/\">\r\n <img\r\n src=\"/Login/SystemThemes/Default/LoginFormPanel/logo.jpg\"\r\n alt=\"[LoginFrom_Title]\"\r\n width=\"175\"\r\n height=\"175\"\r\n loading=\"lazy\"\r\n />\r\n </a>\r\n <div class=\"tw-mt-5\">\r\n <h3 class=\"tw-text-lg tw-font-semibold\">\r\n {{ appSettings().Section1Description }}\r\n </h3>\r\n </div>\r\n </div>\r\n\r\n <!-- \u0641\u0631\u0645 \u0648\u0631\u0648\u062F -->\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n\r\n <hr class=\"login-divider tw-my-4\" />\r\n\r\n <div\r\n class=\"tw-flex tw-flex-col md:tw-flex-row tw-gap-2 md:tw-gap-4 tw-justify-start tw-text-sm\"\r\n >\r\n <a\r\n id=\"forgetPassword\"\r\n class=\"auth-link tw-pt-2\"\r\n tabindex=\"6\"\r\n onclick=\"LoginFormUi.ForgetPassword()\"\r\n >\r\n \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0641\u0631\u0627\u0645\u0648\u0634 \u06A9\u0631\u062F\u0647 \u0627\u0645\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tw-hidden md:tw-block md:tw-w-1/12\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n </div>\r\n</ng-template>\r\n<ng-template #side>\r\n <div class=\"login-page tw-w-full tw-h-full\">\r\n <div class=\"tw-flex tw-justify-center tw-h-screen tw-flex-row-reverse\">\r\n <div\r\n class=\"tw-hidden tw-bg-cover lg:tw-block lg:tw-w-2/3\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().BackgroundPicture\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfBackground:appSettings().HeightOfBackground) +\r\n ')'\r\n \"\r\n >\r\n <div class=\"login-hero-overlay tw-flex tw-items-center tw-h-full tw-px-20\">\r\n <div>\r\n <h2 class=\"login-hero-title tw-text-4xl tw-font-bold\">\r\n {{ appSettings().Section1Title }}\r\n </h2>\r\n <p class=\"login-hero-description tw-max-w-xl tw-mt-3\">\r\n {{ appSettings().Section1Description }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n @if(appSettings().LoginSectionBackground){\r\n <div\r\n class=\"tw-flex tw-items-center tw-w-full tw-px-6 lg:tw-w-2/6 tw-absolute tw-right-0 tw-top-0 tw-bottom-0\"\r\n [style.background-image]=\"\r\n 'url(' +\r\n (appSettings().LoginSectionBackground\r\n | picFieldSrc\r\n : 'ID'\r\n : null\r\n : ''\r\n : appSettings().WidthOfLoginSectionBackground\r\n : appSettings().HeightOfLoginSectionBackground) +\r\n ')'\r\n \"\r\n ></div>\r\n }\r\n <div class=\"tw-flex tw-items-center tw-w-full tw-max-w-md tw-px-6 tw-mx-auto lg:tw-w-2/6 tw-relative\">\r\n <div class=\"tw-flex-1 tw-h-[40rem]\">\r\n <div class=\"tw-text-center tw-flex tw-flex-col tw-items-center tw-mb-8 tw-gap-4\">\r\n <div\r\n class=\"tw-flex tw-items-center\"\r\n [class.tw-flex-col]=\"appSettings().LogoOnTop\"\r\n [class.tw-gap-2]=\"!appSettings().LogoOnTop\"\r\n [class.tw-gap-4]=\"appSettings().LogoOnTop\"\r\n >\r\n <img\r\n loading=\"lazy\"\r\n [src]=\"\r\n appSettings().Logo\r\n | picFieldSrc: 'ID':null:'':appSettings().WidthOfLogo:appSettings().HeightOfLogo\r\n \"\r\n />\r\n @if(appSettings().Title){\r\n <h2 class=\"login-title tw-text-2xl tw-font-bold tw-text-center\">\r\n {{ appSettings().Title }}\r\n </h2>\r\n }\r\n </div>\r\n @if(appSettings().Subtitle ){\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <p class=\"login-subtitle tw-text-xl tw-mt-1\">\r\n {{ appSettings().Subtitle }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n <ba-auth [appSettings]=\"appSettings()\" (verified)=\"onVerified($event)\"></ba-auth>\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--sapTextColor, #32363a);font-family:var(--sapFontFamily, sans-serif);font-size:var(--sapFontSize, .875rem);--button-loading: var(--sapButton_Emphasized_Background, #0a6ed1);--button-loading-active: var(--sapButton_Emphasized_Active_Background, #0854a0);--button-loading-text-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-border-top-color: var(--sapButton_Emphasized_TextColor, #fff);--button-loading-transparent-active: var(--sapButton_Hover_Background, #ebf5fe);--button-loading-transparent-border-top-color: var(--sapButton_Emphasized_Background, #0a6ed1);display:block;min-height:100%}.login-section,.login-page{color:var(--sapTextColor, #32363a);background:var(--sapBackgroundColor, #f7f7f7)}.login-panel{border:var(--sapElement_BorderWidth, .0625rem) solid var(--sapGroup_ContentBorderColor, #d9d9d9);color:var(--sapTextColor, #32363a);background:var(--sapGroup_ContentBackground, #fff);box-shadow:var(--sapContent_Shadow1, 0 .125rem .5rem rgba(0, 0, 0, .2))}.login-divider{border:0;border-block-start:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #d9d9d9)}.auth-link{color:var(--sapLinkColor, #0a6ed1);font-family:var(--sapFontFamily, sans-serif);cursor:pointer;text-decoration:none}.auth-link:visited{color:var(--sapLink_Visited_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:hover{color:var(--sapLink_Hover_Color, var(--sapLinkColor, #0a6ed1));text-decoration:underline}.auth-link:active{color:var(--sapLink_Active_Color, var(--sapLinkColor, #0a6ed1))}.auth-link:focus-visible{border-radius:var(--sapElement_BorderCornerRadius, .25rem);outline:var(--sapContent_FocusWidth, .125rem) var(--sapContent_FocusStyle, solid) var(--sapContent_FocusColor, #0854a0);outline-offset:.125rem}.login-hero-overlay{background:color-mix(in srgb,var(--sapShell_Background, #354a5f) 72%,transparent)}.login-hero-title{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-hero-description{color:var(--sapShell_TextColor, #fff);font-family:var(--sapFontFamily, sans-serif);opacity:.82}.login-title{color:var(--sapTitleColor, #32363a);font-family:var(--sapFontHeaderFamily, var(--sapFontFamily, sans-serif))}.login-subtitle{color:var(--sapContent_LabelColor, #556b82);font-family:var(--sapFontFamily, sans-serif)}\n"] }]
534
880
  }], propDecorators: { _errorTemplate: [{
535
881
  type: ViewChild,
536
882
  args: ['template', { static: true, read: TemplateRef }]
@@ -542,7 +888,8 @@ const components = [
542
888
  VerificationComponent,
543
889
  TimerCountDownComponent,
544
890
  UserPassComponent,
545
- LoginComponent
891
+ LoginComponent,
892
+ PasskeyComponent
546
893
  ];
547
894
  class BarsaAuthModule extends BaseModule {
548
895
  /** Inserted by Angular inject() migration for backwards compatibility */
@@ -552,21 +899,23 @@ class BarsaAuthModule extends BaseModule {
552
899
  this.dynamicComponents = [...components];
553
900
  this.dcm = dcm;
554
901
  }
555
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BarsaAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
556
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.17", ngImport: i0, type: BarsaAuthModule, declarations: [BarsaAuthComponent,
902
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
903
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, declarations: [BarsaAuthComponent,
557
904
  EnterMobileComponent,
558
905
  VerificationComponent,
559
906
  TimerCountDownComponent,
560
907
  UserPassComponent,
561
- LoginComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule], exports: [BarsaAuthComponent,
908
+ LoginComponent,
909
+ PasskeyComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule], exports: [BarsaAuthComponent,
562
910
  EnterMobileComponent,
563
911
  VerificationComponent,
564
912
  TimerCountDownComponent,
565
913
  UserPassComponent,
566
- LoginComponent] }); }
567
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BarsaAuthModule, imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule] }); }
914
+ LoginComponent,
915
+ PasskeyComponent] }); }
916
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule] }); }
568
917
  }
569
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BarsaAuthModule, decorators: [{
918
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, decorators: [{
570
919
  type: NgModule,
571
920
  args: [{
572
921
  declarations: [...components],
@@ -583,5 +932,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
583
932
  * Generated bundle index. Do not edit.
584
933
  */
585
934
 
586
- export { BarsaAuthComponent, BarsaAuthModule, EnterMobileComponent, LoginComponent, LoginMobileController, LoginUserPassController, LoginVerificationController, TimerCountDownComponent, UserPassComponent, VerificationComponent };
935
+ export { BarsaAuthComponent, BarsaAuthModule, EnterMobileComponent, LoginComponent, LoginMobileController, LoginUserPassController, LoginVerificationController, PasskeyComponent, PasskeyService, TimerCountDownComponent, UserPassComponent, VerificationComponent };
587
936
  //# sourceMappingURL=barsa-auth.mjs.map