barsa-auth 2.3.165 → 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
  *
@@ -207,11 +400,11 @@ class EnterMobileComponent extends ViewBase {
207
400
  this.controller.sendCode(this.otpProvider, this.form.value);
208
401
  }
209
402
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
210
- 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=\"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]):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 }); }
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 }); }
211
404
  }
212
405
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EnterMobileComponent, decorators: [{
213
406
  type: Component,
214
- 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"] }]
215
408
  }], ctorParameters: () => [], propDecorators: { otpSent: [{
216
409
  type: Output
217
410
  }], errorTemplate: [{
@@ -283,11 +476,11 @@ class TimerCountDownComponent extends BaseComponent {
283
476
  }
284
477
  }
285
478
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
286
- 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=\"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 }); }
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 }); }
287
480
  }
288
481
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TimerCountDownComponent, decorators: [{
289
482
  type: Component,
290
- 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"] }]
291
484
  }], propDecorators: { resend: [{
292
485
  type: Output
293
486
  }], minutes: [{
@@ -364,11 +557,11 @@ class VerificationComponent extends ViewBase {
364
557
  return this.controller.canVerify();
365
558
  }
366
559
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
367
- 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=\"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]):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 }); }
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 }); }
368
561
  }
369
562
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: VerificationComponent, decorators: [{
370
563
  type: Component,
371
- 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"] }]
372
565
  }], ctorParameters: () => [], propDecorators: { _timerCountDown: [{
373
566
  type: ViewChild,
374
567
  args: [TimerCountDownComponent]
@@ -452,11 +645,11 @@ class UserPassComponent extends ViewBase {
452
645
  this.canLogin() && !this.loading() && this.controller.login(this.form.value);
453
646
  }
454
647
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
455
- 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=\"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]):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 }); }
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 }); }
456
649
  }
457
650
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: UserPassComponent, decorators: [{
458
651
  type: Component,
459
- 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"] }]
460
653
  }], ctorParameters: () => [], propDecorators: { loggedIn: [{
461
654
  type: Output
462
655
  }], errorTemplate: [{
@@ -465,6 +658,94 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
465
658
  type: Input
466
659
  }] } });
467
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
+
468
749
  class BarsaAuthComponent {
469
750
  constructor() {
470
751
  this.verified = new EventEmitter();
@@ -476,11 +757,17 @@ class BarsaAuthComponent {
476
757
  ...(ngDevMode ? [{ debugName: "mobile" }] : /* istanbul ignore next */ []));
477
758
  this.loading = signal(false, /* @ts-ignore */
478
759
  ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
760
+ this.passkeyAvailable = signal(false, /* @ts-ignore */
761
+ ...(ngDevMode ? [{ debugName: "passkeyAvailable" }] : /* istanbul ignore next */ []));
479
762
  this._portalService = inject(PortalService);
480
763
  this._applicationCtrlrService = inject(ApplicationCtrlrService);
764
+ this.passkeyService = inject(PasskeyService);
481
765
  }
482
766
  ngOnInit() {
483
767
  this.state.set(this.appSettings().DefaultState || 'enter-mobile');
768
+ if (this.appSettings().PasskeyEnable) {
769
+ void this.updatePasskeyAvailability();
770
+ }
484
771
  }
485
772
  onChangeState(state) {
486
773
  this.state.set(state);
@@ -493,15 +780,47 @@ class BarsaAuthComponent {
493
780
  this.state.set('verification');
494
781
  }
495
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() {
496
795
  this.loading.set(true);
497
- 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();
813
+ }
814
+ finishLogin(token2) {
815
+ this.loading.set(false);
816
+ this.verified.emit(token2);
498
817
  }
499
818
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
500
- 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\">\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" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
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 }); }
501
820
  }
502
821
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthComponent, decorators: [{
503
822
  type: Component,
504
- 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\">\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"] }]
505
824
  }], propDecorators: { verified: [{
506
825
  type: Output
507
826
  }], appSettings: [{ type: i0.Input, args: [{ isSignal: true, alias: "appSettings", required: true }] }] } });
@@ -543,15 +862,21 @@ class LoginComponent {
543
862
  this.appSettings.set(resolverData.loginSettings);
544
863
  }
545
864
  }
546
- 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
+ }
547
872
  window.location.href = window.location.origin;
548
873
  }
549
874
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
550
- 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=\"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 }); }
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 }); }
551
876
  }
552
877
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoginComponent, decorators: [{
553
878
  type: Component,
554
- 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"] }]
555
880
  }], propDecorators: { _errorTemplate: [{
556
881
  type: ViewChild,
557
882
  args: ['template', { static: true, read: TemplateRef }]
@@ -563,7 +888,8 @@ const components = [
563
888
  VerificationComponent,
564
889
  TimerCountDownComponent,
565
890
  UserPassComponent,
566
- LoginComponent
891
+ LoginComponent,
892
+ PasskeyComponent
567
893
  ];
568
894
  class BarsaAuthModule extends BaseModule {
569
895
  /** Inserted by Angular inject() migration for backwards compatibility */
@@ -579,12 +905,14 @@ class BarsaAuthModule extends BaseModule {
579
905
  VerificationComponent,
580
906
  TimerCountDownComponent,
581
907
  UserPassComponent,
582
- LoginComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule], exports: [BarsaAuthComponent,
908
+ LoginComponent,
909
+ PasskeyComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule], exports: [BarsaAuthComponent,
583
910
  EnterMobileComponent,
584
911
  VerificationComponent,
585
912
  TimerCountDownComponent,
586
913
  UserPassComponent,
587
- LoginComponent] }); }
914
+ LoginComponent,
915
+ PasskeyComponent] }); }
588
916
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, imports: [CommonModule, FormsModule, ReactiveFormsModule, BarsaNovinRayCoreModule] }); }
589
917
  }
590
918
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaAuthModule, decorators: [{
@@ -604,5 +932,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
604
932
  * Generated bundle index. Do not edit.
605
933
  */
606
934
 
607
- 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 };
608
936
  //# sourceMappingURL=barsa-auth.mjs.map