@firebase-oss/ui-angular 0.0.1
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.
- package/README.md +64 -0
- package/dist/README.md +64 -0
- package/dist/fesm2022/firebase-oss-ui-angular.mjs +3288 -0
- package/dist/fesm2022/firebase-oss-ui-angular.mjs.map +1 -0
- package/dist/index.d.ts +804 -0
- package/package.json +66 -0
|
@@ -0,0 +1,3288 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, HostBinding, Component, computed, InjectionToken, inject, makeEnvironmentProviders, signal, effect, output, viewChild, model, isDevMode } from '@angular/core';
|
|
3
|
+
import { getBehavior, getTranslation, createSignInAuthFormSchema, createSignUpAuthFormSchema, createForgotPasswordAuthFormSchema, createEmailLinkAuthFormSchema, createPhoneAuthNumberFormSchema, createPhoneAuthVerifyFormSchema, createMultiFactorPhoneAuthNumberFormSchema, createMultiFactorPhoneAuthVerifyFormSchema, createMultiFactorTotpAuthNumberFormSchema, createMultiFactorTotpAuthVerifyFormSchema, sendSignInLinkToEmail, FirebaseUIError, completeEmailLinkSignIn, sendPasswordResetEmail, verifyPhoneNumber, signInWithMultiFactorAssertion, countryData, formatPhoneNumber, confirmPhoneNumber, signInWithEmailAndPassword, hasBehavior, createUserWithEmailAndPassword, signInWithProvider, registerFramework } from '@firebase-oss/ui-core';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { injectField, injectForm, injectStore, TanStackField, TanStackAppField } from '@tanstack/angular-form';
|
|
6
|
+
import { buttonVariant } from '@firebase-oss/ui-styles';
|
|
7
|
+
import { FirebaseApps } from '@angular/fire/app';
|
|
8
|
+
import { PhoneAuthProvider, PhoneMultiFactorGenerator, TotpMultiFactorGenerator } from 'firebase/auth';
|
|
9
|
+
import * as i1 from '@angular/forms';
|
|
10
|
+
import { FormsModule } from '@angular/forms';
|
|
11
|
+
import { GoogleAuthProvider, FacebookAuthProvider, OAuthProvider, TwitterAuthProvider, GithubAuthProvider } from '@angular/fire/auth';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Copyright 2025 Google LLC
|
|
15
|
+
*
|
|
16
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
17
|
+
* you may not use this file except in compliance with the License.
|
|
18
|
+
* You may obtain a copy of the License at
|
|
19
|
+
*
|
|
20
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
21
|
+
*
|
|
22
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
23
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
24
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
25
|
+
* See the License for the specific language governing permissions and
|
|
26
|
+
* limitations under the License.
|
|
27
|
+
*/
|
|
28
|
+
class ButtonComponent {
|
|
29
|
+
variant = input(...(ngDevMode ? [undefined, { debugName: "variant" }] : []));
|
|
30
|
+
get getButtonClasses() {
|
|
31
|
+
return buttonVariant({ variant: this.variant() });
|
|
32
|
+
}
|
|
33
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
34
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: ButtonComponent, isStandalone: true, selector: "button[fui-button]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.getButtonClasses" } }, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true });
|
|
35
|
+
}
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ButtonComponent, decorators: [{
|
|
37
|
+
type: Component,
|
|
38
|
+
args: [{
|
|
39
|
+
selector: "button[fui-button]",
|
|
40
|
+
template: `<ng-content></ng-content>`,
|
|
41
|
+
standalone: true,
|
|
42
|
+
}]
|
|
43
|
+
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], getButtonClasses: [{
|
|
44
|
+
type: HostBinding,
|
|
45
|
+
args: ["class"]
|
|
46
|
+
}] } });
|
|
47
|
+
|
|
48
|
+
class FormMetadataComponent {
|
|
49
|
+
field = input.required(...(ngDevMode ? [{ debugName: "field" }] : []));
|
|
50
|
+
errors = computed(() => this.field()
|
|
51
|
+
.state.meta.errors.map((error) => error.message)
|
|
52
|
+
.join(", "), ...(ngDevMode ? [{ debugName: "errors" }] : []));
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormMetadataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
54
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: FormMetadataComponent, isStandalone: true, selector: "fui-form-metadata", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
55
|
+
@if (field().state.meta.isTouched && errors().length > 0) {
|
|
56
|
+
<div>
|
|
57
|
+
<div role="alert" aria-live="polite" class="fui-form__error">
|
|
58
|
+
{{ errors() }}
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
}
|
|
62
|
+
`, isInline: true });
|
|
63
|
+
}
|
|
64
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormMetadataComponent, decorators: [{
|
|
65
|
+
type: Component,
|
|
66
|
+
args: [{
|
|
67
|
+
selector: "fui-form-metadata",
|
|
68
|
+
standalone: true,
|
|
69
|
+
template: `
|
|
70
|
+
@if (field().state.meta.isTouched && errors().length > 0) {
|
|
71
|
+
<div>
|
|
72
|
+
<div role="alert" aria-live="polite" class="fui-form__error">
|
|
73
|
+
{{ errors() }}
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
}
|
|
77
|
+
`,
|
|
78
|
+
}]
|
|
79
|
+
}], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }] } });
|
|
80
|
+
class FormInputComponent {
|
|
81
|
+
field = injectField();
|
|
82
|
+
label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
|
|
83
|
+
type = input("text", ...(ngDevMode ? [{ debugName: "type" }] : []));
|
|
84
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
85
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: FormInputComponent, isStandalone: true, selector: "fui-form-input", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
86
|
+
<label [for]="field.api.name">
|
|
87
|
+
<div data-input-label>
|
|
88
|
+
<div>{{ label() }}</div>
|
|
89
|
+
<div><ng-content select="input-action" /></div>
|
|
90
|
+
</div>
|
|
91
|
+
<div data-input-group>
|
|
92
|
+
<ng-content select="input-before" />
|
|
93
|
+
<input
|
|
94
|
+
[attr.aria-invalid]="field.api.state.meta.isTouched && field.api.state.meta.errors.length > 0"
|
|
95
|
+
[id]="field.api.name"
|
|
96
|
+
[name]="field.api.name"
|
|
97
|
+
[value]="field.api.state.value"
|
|
98
|
+
(blur)="field.api.handleBlur()"
|
|
99
|
+
(input)="field.api.handleChange($any($event).target.value)"
|
|
100
|
+
[type]="type()"
|
|
101
|
+
/>
|
|
102
|
+
</div>
|
|
103
|
+
<ng-content></ng-content>
|
|
104
|
+
<fui-form-metadata [field]="field.api"></fui-form-metadata>
|
|
105
|
+
</label>
|
|
106
|
+
`, isInline: true, dependencies: [{ kind: "component", type: FormMetadataComponent, selector: "fui-form-metadata", inputs: ["field"] }] });
|
|
107
|
+
}
|
|
108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormInputComponent, decorators: [{
|
|
109
|
+
type: Component,
|
|
110
|
+
args: [{
|
|
111
|
+
selector: "fui-form-input",
|
|
112
|
+
standalone: true,
|
|
113
|
+
imports: [FormMetadataComponent],
|
|
114
|
+
template: `
|
|
115
|
+
<label [for]="field.api.name">
|
|
116
|
+
<div data-input-label>
|
|
117
|
+
<div>{{ label() }}</div>
|
|
118
|
+
<div><ng-content select="input-action" /></div>
|
|
119
|
+
</div>
|
|
120
|
+
<div data-input-group>
|
|
121
|
+
<ng-content select="input-before" />
|
|
122
|
+
<input
|
|
123
|
+
[attr.aria-invalid]="field.api.state.meta.isTouched && field.api.state.meta.errors.length > 0"
|
|
124
|
+
[id]="field.api.name"
|
|
125
|
+
[name]="field.api.name"
|
|
126
|
+
[value]="field.api.state.value"
|
|
127
|
+
(blur)="field.api.handleBlur()"
|
|
128
|
+
(input)="field.api.handleChange($any($event).target.value)"
|
|
129
|
+
[type]="type()"
|
|
130
|
+
/>
|
|
131
|
+
</div>
|
|
132
|
+
<ng-content></ng-content>
|
|
133
|
+
<fui-form-metadata [field]="field.api"></fui-form-metadata>
|
|
134
|
+
</label>
|
|
135
|
+
`,
|
|
136
|
+
}]
|
|
137
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }] } });
|
|
138
|
+
class FormActionComponent {
|
|
139
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
140
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: FormActionComponent, isStandalone: true, selector: "button[fui-form-action]", host: { attributes: { "type": "button" }, classAttribute: "fui-form__action" }, ngImport: i0, template: `<ng-content></ng-content> `, isInline: true });
|
|
141
|
+
}
|
|
142
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormActionComponent, decorators: [{
|
|
143
|
+
type: Component,
|
|
144
|
+
args: [{
|
|
145
|
+
selector: "button[fui-form-action]",
|
|
146
|
+
standalone: true,
|
|
147
|
+
host: {
|
|
148
|
+
class: "fui-form__action",
|
|
149
|
+
type: "button",
|
|
150
|
+
},
|
|
151
|
+
template: `<ng-content></ng-content> `,
|
|
152
|
+
}]
|
|
153
|
+
}] });
|
|
154
|
+
class FormSubmitComponent {
|
|
155
|
+
class = input(...(ngDevMode ? [undefined, { debugName: "class" }] : []));
|
|
156
|
+
state = input.required(...(ngDevMode ? [{ debugName: "state" }] : []));
|
|
157
|
+
isSubmitting = computed(() => this.state().isSubmitting, ...(ngDevMode ? [{ debugName: "isSubmitting" }] : []));
|
|
158
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormSubmitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
159
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: FormSubmitComponent, isStandalone: true, selector: "fui-form-submit", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "type": "submit" } }, ngImport: i0, template: `
|
|
160
|
+
<button fui-button class="fui-form__action" [class]="class()" [disabled]="isSubmitting()">
|
|
161
|
+
<ng-content></ng-content>
|
|
162
|
+
</button>
|
|
163
|
+
`, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[fui-button]", inputs: ["variant"] }] });
|
|
164
|
+
}
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormSubmitComponent, decorators: [{
|
|
166
|
+
type: Component,
|
|
167
|
+
args: [{
|
|
168
|
+
selector: "fui-form-submit",
|
|
169
|
+
standalone: true,
|
|
170
|
+
imports: [ButtonComponent],
|
|
171
|
+
host: {
|
|
172
|
+
type: "submit",
|
|
173
|
+
},
|
|
174
|
+
template: `
|
|
175
|
+
<button fui-button class="fui-form__action" [class]="class()" [disabled]="isSubmitting()">
|
|
176
|
+
<ng-content></ng-content>
|
|
177
|
+
</button>
|
|
178
|
+
`,
|
|
179
|
+
}]
|
|
180
|
+
}], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: true }] }] } });
|
|
181
|
+
class FormErrorMessageComponent {
|
|
182
|
+
state = input.required(...(ngDevMode ? [{ debugName: "state" }] : []));
|
|
183
|
+
errorMessage = computed(() => {
|
|
184
|
+
const error = this.state().errorMap?.onSubmit;
|
|
185
|
+
// We only care about errors thrown from the form submission, rather than validation errors
|
|
186
|
+
if (error && typeof error === "string") {
|
|
187
|
+
return error;
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}, ...(ngDevMode ? [{ debugName: "errorMessage" }] : []));
|
|
191
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormErrorMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
192
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: FormErrorMessageComponent, isStandalone: true, selector: "fui-form-error-message", inputs: { state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
193
|
+
@if (errorMessage()) {
|
|
194
|
+
<div class="fui-form__error">
|
|
195
|
+
{{ errorMessage() }}
|
|
196
|
+
</div>
|
|
197
|
+
}
|
|
198
|
+
`, isInline: true });
|
|
199
|
+
}
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FormErrorMessageComponent, decorators: [{
|
|
201
|
+
type: Component,
|
|
202
|
+
args: [{
|
|
203
|
+
selector: "fui-form-error-message",
|
|
204
|
+
standalone: true,
|
|
205
|
+
template: `
|
|
206
|
+
@if (errorMessage()) {
|
|
207
|
+
<div class="fui-form__error">
|
|
208
|
+
{{ errorMessage() }}
|
|
209
|
+
</div>
|
|
210
|
+
}
|
|
211
|
+
`,
|
|
212
|
+
}]
|
|
213
|
+
}], propDecorators: { state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: true }] }] } });
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Copyright 2025 Google LLC
|
|
217
|
+
*
|
|
218
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
219
|
+
* you may not use this file except in compliance with the License.
|
|
220
|
+
* You may obtain a copy of the License at
|
|
221
|
+
*
|
|
222
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
223
|
+
*
|
|
224
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
225
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
226
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
227
|
+
* See the License for the specific language governing permissions and
|
|
228
|
+
* limitations under the License.
|
|
229
|
+
*/
|
|
230
|
+
const FIREBASE_UI_STORE = new InjectionToken("firebaseui.store");
|
|
231
|
+
const FIREBASE_UI_POLICIES = new InjectionToken("firebaseui.policies");
|
|
232
|
+
function provideFirebaseUI(uiFactory) {
|
|
233
|
+
const providers = [
|
|
234
|
+
// TODO: This should depend on the FirebaseAuth provider via deps,
|
|
235
|
+
// see https://github.com/angular/angularfire/blob/35e0a9859299010488852b1826e4083abe56528f/src/firestore/firestore.module.ts#L76
|
|
236
|
+
{
|
|
237
|
+
provide: FIREBASE_UI_STORE,
|
|
238
|
+
useFactory: () => {
|
|
239
|
+
const apps = inject(FirebaseApps);
|
|
240
|
+
if (!apps || apps.length === 0) {
|
|
241
|
+
throw new Error("No Firebase apps found");
|
|
242
|
+
}
|
|
243
|
+
return uiFactory(apps);
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
return makeEnvironmentProviders(providers);
|
|
248
|
+
}
|
|
249
|
+
function provideFirebaseUIPolicies(factory) {
|
|
250
|
+
const providers = [{ provide: FIREBASE_UI_POLICIES, useFactory: factory }];
|
|
251
|
+
return makeEnvironmentProviders(providers);
|
|
252
|
+
}
|
|
253
|
+
function injectUI() {
|
|
254
|
+
const store = inject(FIREBASE_UI_STORE);
|
|
255
|
+
const ui = signal(store.get(), ...(ngDevMode ? [{ debugName: "ui" }] : []));
|
|
256
|
+
effect(() => {
|
|
257
|
+
return store.subscribe(ui.set);
|
|
258
|
+
});
|
|
259
|
+
return ui.asReadonly();
|
|
260
|
+
}
|
|
261
|
+
function injectRecaptchaVerifier(element) {
|
|
262
|
+
const ui = injectUI();
|
|
263
|
+
const verifier = computed(() => {
|
|
264
|
+
const elementRef = element();
|
|
265
|
+
if (!elementRef) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
return getBehavior(ui(), "recaptchaVerification")(ui(), elementRef.nativeElement);
|
|
269
|
+
}, ...(ngDevMode ? [{ debugName: "verifier" }] : []));
|
|
270
|
+
effect(() => {
|
|
271
|
+
const verifierInstance = verifier();
|
|
272
|
+
if (verifierInstance) {
|
|
273
|
+
verifierInstance.render();
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
return verifier;
|
|
277
|
+
}
|
|
278
|
+
function injectTranslation(category, key) {
|
|
279
|
+
const ui = injectUI();
|
|
280
|
+
return computed(() => getTranslation(ui(), category, key));
|
|
281
|
+
}
|
|
282
|
+
function injectSignInAuthFormSchema() {
|
|
283
|
+
const ui = injectUI();
|
|
284
|
+
return computed(() => createSignInAuthFormSchema(ui()));
|
|
285
|
+
}
|
|
286
|
+
function injectSignUpAuthFormSchema() {
|
|
287
|
+
const ui = injectUI();
|
|
288
|
+
return computed(() => createSignUpAuthFormSchema(ui()));
|
|
289
|
+
}
|
|
290
|
+
function injectForgotPasswordAuthFormSchema() {
|
|
291
|
+
const ui = injectUI();
|
|
292
|
+
return computed(() => createForgotPasswordAuthFormSchema(ui()));
|
|
293
|
+
}
|
|
294
|
+
function injectEmailLinkAuthFormSchema() {
|
|
295
|
+
const ui = injectUI();
|
|
296
|
+
return computed(() => createEmailLinkAuthFormSchema(ui()));
|
|
297
|
+
}
|
|
298
|
+
function injectPhoneAuthFormSchema() {
|
|
299
|
+
const ui = injectUI();
|
|
300
|
+
return computed(() => createPhoneAuthNumberFormSchema(ui()));
|
|
301
|
+
}
|
|
302
|
+
function injectPhoneAuthVerifyFormSchema() {
|
|
303
|
+
const ui = injectUI();
|
|
304
|
+
return computed(() => createPhoneAuthVerifyFormSchema(ui()));
|
|
305
|
+
}
|
|
306
|
+
function injectMultiFactorPhoneAuthNumberFormSchema() {
|
|
307
|
+
const ui = injectUI();
|
|
308
|
+
return computed(() => createMultiFactorPhoneAuthNumberFormSchema(ui()));
|
|
309
|
+
}
|
|
310
|
+
function injectMultiFactorPhoneAuthVerifyFormSchema() {
|
|
311
|
+
const ui = injectUI();
|
|
312
|
+
return computed(() => createMultiFactorPhoneAuthVerifyFormSchema(ui()));
|
|
313
|
+
}
|
|
314
|
+
function injectMultiFactorTotpAuthNumberFormSchema() {
|
|
315
|
+
const ui = injectUI();
|
|
316
|
+
return computed(() => createMultiFactorTotpAuthNumberFormSchema(ui()));
|
|
317
|
+
}
|
|
318
|
+
function injectMultiFactorTotpAuthVerifyFormSchema() {
|
|
319
|
+
const ui = injectUI();
|
|
320
|
+
return computed(() => createMultiFactorTotpAuthVerifyFormSchema(ui()));
|
|
321
|
+
}
|
|
322
|
+
function injectPolicies() {
|
|
323
|
+
return inject(FIREBASE_UI_POLICIES, { optional: true });
|
|
324
|
+
}
|
|
325
|
+
function injectCountries() {
|
|
326
|
+
const ui = injectUI();
|
|
327
|
+
return computed(() => getBehavior(ui(), "countryCodes")().allowedCountries);
|
|
328
|
+
}
|
|
329
|
+
function injectDefaultCountry() {
|
|
330
|
+
const ui = injectUI();
|
|
331
|
+
return computed(() => getBehavior(ui(), "countryCodes")().defaultCountry);
|
|
332
|
+
}
|
|
333
|
+
function injectRedirectError() {
|
|
334
|
+
const ui = injectUI();
|
|
335
|
+
return computed(() => {
|
|
336
|
+
const redirectError = ui().redirectError;
|
|
337
|
+
if (!redirectError) {
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
return redirectError instanceof Error ? redirectError.message : String(redirectError);
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Copyright 2025 Google LLC
|
|
346
|
+
*
|
|
347
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
348
|
+
* you may not use this file except in compliance with the License.
|
|
349
|
+
* You may obtain a copy of the License at
|
|
350
|
+
*
|
|
351
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
352
|
+
*
|
|
353
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
354
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
355
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
356
|
+
* See the License for the specific language governing permissions and
|
|
357
|
+
* limitations under the License.
|
|
358
|
+
*/
|
|
359
|
+
class PoliciesComponent {
|
|
360
|
+
policies = injectPolicies();
|
|
361
|
+
termsText = injectTranslation("labels", "termsOfService");
|
|
362
|
+
privacyText = injectTranslation("labels", "privacyPolicy");
|
|
363
|
+
templateText = injectTranslation("messages", "termsAndPrivacy");
|
|
364
|
+
tosUrl = this.policies?.termsOfServiceUrl;
|
|
365
|
+
privacyPolicyUrl = this.policies?.privacyPolicyUrl;
|
|
366
|
+
shouldShow = computed(() => this.policies !== null, ...(ngDevMode ? [{ debugName: "shouldShow" }] : []));
|
|
367
|
+
policyParts = computed(() => {
|
|
368
|
+
if (!this.shouldShow()) {
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
const template = this.templateText();
|
|
372
|
+
const parts = template.split(/({tos}|{privacy})/);
|
|
373
|
+
return parts
|
|
374
|
+
.filter((part) => part.length > 0)
|
|
375
|
+
.map((part) => {
|
|
376
|
+
if (part === "{tos}" && this.tosUrl) {
|
|
377
|
+
return {
|
|
378
|
+
type: "tos",
|
|
379
|
+
url: this.tosUrl,
|
|
380
|
+
text: this.termsText(),
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
if (part === "{privacy}" && this.privacyPolicyUrl) {
|
|
384
|
+
return {
|
|
385
|
+
type: "privacy",
|
|
386
|
+
url: this.privacyPolicyUrl,
|
|
387
|
+
text: this.privacyText(),
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
type: "text",
|
|
392
|
+
content: part,
|
|
393
|
+
};
|
|
394
|
+
});
|
|
395
|
+
}, ...(ngDevMode ? [{ debugName: "policyParts" }] : []));
|
|
396
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PoliciesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
397
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: PoliciesComponent, isStandalone: true, selector: "fui-policies", ngImport: i0, template: `
|
|
398
|
+
@if (shouldShow()) {
|
|
399
|
+
<div class="fui-policies">
|
|
400
|
+
@for (part of policyParts(); track $index) {
|
|
401
|
+
@if (part.type === "tos") {
|
|
402
|
+
<a [attr.href]="part.url" target="_blank" rel="noopener noreferrer">
|
|
403
|
+
{{ part.text }}
|
|
404
|
+
</a>
|
|
405
|
+
} @else if (part.type === "privacy") {
|
|
406
|
+
<a [attr.href]="part.url" target="_blank" rel="noopener noreferrer">
|
|
407
|
+
{{ part.text }}
|
|
408
|
+
</a>
|
|
409
|
+
} @else {
|
|
410
|
+
<span>{{ part.content }}</span>
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
</div>
|
|
414
|
+
}
|
|
415
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
416
|
+
}
|
|
417
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PoliciesComponent, decorators: [{
|
|
418
|
+
type: Component,
|
|
419
|
+
args: [{
|
|
420
|
+
selector: "fui-policies",
|
|
421
|
+
standalone: true,
|
|
422
|
+
imports: [CommonModule],
|
|
423
|
+
template: `
|
|
424
|
+
@if (shouldShow()) {
|
|
425
|
+
<div class="fui-policies">
|
|
426
|
+
@for (part of policyParts(); track $index) {
|
|
427
|
+
@if (part.type === "tos") {
|
|
428
|
+
<a [attr.href]="part.url" target="_blank" rel="noopener noreferrer">
|
|
429
|
+
{{ part.text }}
|
|
430
|
+
</a>
|
|
431
|
+
} @else if (part.type === "privacy") {
|
|
432
|
+
<a [attr.href]="part.url" target="_blank" rel="noopener noreferrer">
|
|
433
|
+
{{ part.text }}
|
|
434
|
+
</a>
|
|
435
|
+
} @else {
|
|
436
|
+
<span>{{ part.content }}</span>
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
</div>
|
|
440
|
+
}
|
|
441
|
+
`,
|
|
442
|
+
}]
|
|
443
|
+
}] });
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Copyright 2025 Google LLC
|
|
447
|
+
*
|
|
448
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
449
|
+
* you may not use this file except in compliance with the License.
|
|
450
|
+
* You may obtain a copy of the License at
|
|
451
|
+
*
|
|
452
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
453
|
+
*
|
|
454
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
455
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
456
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
457
|
+
* See the License for the specific language governing permissions and
|
|
458
|
+
* limitations under the License.
|
|
459
|
+
*/
|
|
460
|
+
class EmailLinkAuthFormComponent {
|
|
461
|
+
ui = injectUI();
|
|
462
|
+
formSchema = injectEmailLinkAuthFormSchema();
|
|
463
|
+
emailSentState = signal(false, ...(ngDevMode ? [{ debugName: "emailSentState" }] : []));
|
|
464
|
+
emailLabel = injectTranslation("labels", "emailAddress");
|
|
465
|
+
sendSignInLinkLabel = injectTranslation("labels", "sendSignInLink");
|
|
466
|
+
emailSentMessage = injectTranslation("messages", "signInLinkSent");
|
|
467
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
468
|
+
emailSent = output();
|
|
469
|
+
signIn = output();
|
|
470
|
+
form = injectForm({
|
|
471
|
+
defaultValues: {
|
|
472
|
+
email: "",
|
|
473
|
+
},
|
|
474
|
+
});
|
|
475
|
+
state = injectStore(this.form, (state) => state);
|
|
476
|
+
async handleSubmit(event) {
|
|
477
|
+
event.preventDefault();
|
|
478
|
+
event.stopPropagation();
|
|
479
|
+
this.form.handleSubmit();
|
|
480
|
+
}
|
|
481
|
+
constructor() {
|
|
482
|
+
this.completeSignIn();
|
|
483
|
+
effect(() => {
|
|
484
|
+
this.form.update({
|
|
485
|
+
validators: {
|
|
486
|
+
onBlur: this.formSchema(),
|
|
487
|
+
onSubmit: this.formSchema(),
|
|
488
|
+
onSubmitAsync: async ({ value }) => {
|
|
489
|
+
try {
|
|
490
|
+
await sendSignInLinkToEmail(this.ui(), value.email);
|
|
491
|
+
this.emailSentState.set(true);
|
|
492
|
+
this.emailSent?.emit();
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
if (error instanceof FirebaseUIError) {
|
|
497
|
+
return error.message;
|
|
498
|
+
}
|
|
499
|
+
return this.unknownErrorLabel();
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
},
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
async completeSignIn() {
|
|
507
|
+
const credential = await completeEmailLinkSignIn(this.ui(), window.location.href);
|
|
508
|
+
if (credential) {
|
|
509
|
+
this.signIn?.emit(credential);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: EmailLinkAuthFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
513
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: EmailLinkAuthFormComponent, isStandalone: true, selector: "fui-email-link-auth-form", outputs: { emailSent: "emailSent", signIn: "signIn" }, ngImport: i0, template: `
|
|
514
|
+
@if (emailSentState()) {
|
|
515
|
+
<div class="fui-form__success">
|
|
516
|
+
{{ emailSentMessage() }}
|
|
517
|
+
</div>
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
@if (!emailSentState()) {
|
|
521
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
522
|
+
<fieldset>
|
|
523
|
+
<fui-form-input name="email" tanstack-app-field [tanstackField]="form" label="{{ emailLabel() }}" />
|
|
524
|
+
</fieldset>
|
|
525
|
+
|
|
526
|
+
<fui-policies />
|
|
527
|
+
|
|
528
|
+
<fieldset>
|
|
529
|
+
<fui-form-submit [state]="state()">
|
|
530
|
+
{{ sendSignInLinkLabel() }}
|
|
531
|
+
</fui-form-submit>
|
|
532
|
+
<fui-form-error-message [state]="state()" />
|
|
533
|
+
</fieldset>
|
|
534
|
+
</form>
|
|
535
|
+
}
|
|
536
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }] });
|
|
537
|
+
}
|
|
538
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: EmailLinkAuthFormComponent, decorators: [{
|
|
539
|
+
type: Component,
|
|
540
|
+
args: [{
|
|
541
|
+
selector: "fui-email-link-auth-form",
|
|
542
|
+
standalone: true,
|
|
543
|
+
imports: [
|
|
544
|
+
CommonModule,
|
|
545
|
+
TanStackField,
|
|
546
|
+
TanStackAppField,
|
|
547
|
+
PoliciesComponent,
|
|
548
|
+
FormInputComponent,
|
|
549
|
+
FormSubmitComponent,
|
|
550
|
+
FormErrorMessageComponent,
|
|
551
|
+
],
|
|
552
|
+
template: `
|
|
553
|
+
@if (emailSentState()) {
|
|
554
|
+
<div class="fui-form__success">
|
|
555
|
+
{{ emailSentMessage() }}
|
|
556
|
+
</div>
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
@if (!emailSentState()) {
|
|
560
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
561
|
+
<fieldset>
|
|
562
|
+
<fui-form-input name="email" tanstack-app-field [tanstackField]="form" label="{{ emailLabel() }}" />
|
|
563
|
+
</fieldset>
|
|
564
|
+
|
|
565
|
+
<fui-policies />
|
|
566
|
+
|
|
567
|
+
<fieldset>
|
|
568
|
+
<fui-form-submit [state]="state()">
|
|
569
|
+
{{ sendSignInLinkLabel() }}
|
|
570
|
+
</fui-form-submit>
|
|
571
|
+
<fui-form-error-message [state]="state()" />
|
|
572
|
+
</fieldset>
|
|
573
|
+
</form>
|
|
574
|
+
}
|
|
575
|
+
`,
|
|
576
|
+
}]
|
|
577
|
+
}], ctorParameters: () => [], propDecorators: { emailSent: [{ type: i0.Output, args: ["emailSent"] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Copyright 2025 Google LLC
|
|
581
|
+
*
|
|
582
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
583
|
+
* you may not use this file except in compliance with the License.
|
|
584
|
+
* You may obtain a copy of the License at
|
|
585
|
+
*
|
|
586
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
587
|
+
*
|
|
588
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
589
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
590
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
591
|
+
* See the License for the specific language governing permissions and
|
|
592
|
+
* limitations under the License.
|
|
593
|
+
*/
|
|
594
|
+
class ForgotPasswordAuthFormComponent {
|
|
595
|
+
ui = injectUI();
|
|
596
|
+
formSchema = injectForgotPasswordAuthFormSchema();
|
|
597
|
+
emailSent = signal(false, ...(ngDevMode ? [{ debugName: "emailSent" }] : []));
|
|
598
|
+
emailLabel = injectTranslation("labels", "emailAddress");
|
|
599
|
+
resetPasswordLabel = injectTranslation("labels", "resetPassword");
|
|
600
|
+
backToSignInLabel = injectTranslation("labels", "backToSignIn");
|
|
601
|
+
checkEmailForResetMessage = injectTranslation("messages", "checkEmailForReset");
|
|
602
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
603
|
+
passwordSent = output();
|
|
604
|
+
backToSignIn = output();
|
|
605
|
+
form = injectForm({
|
|
606
|
+
defaultValues: {
|
|
607
|
+
email: "",
|
|
608
|
+
},
|
|
609
|
+
});
|
|
610
|
+
state = injectStore(this.form, (state) => state);
|
|
611
|
+
async handleSubmit(event) {
|
|
612
|
+
event.preventDefault();
|
|
613
|
+
event.stopPropagation();
|
|
614
|
+
this.form.handleSubmit();
|
|
615
|
+
}
|
|
616
|
+
constructor() {
|
|
617
|
+
effect(() => {
|
|
618
|
+
this.form.update({
|
|
619
|
+
validators: {
|
|
620
|
+
onBlur: this.formSchema(),
|
|
621
|
+
onSubmit: this.formSchema(),
|
|
622
|
+
onSubmitAsync: async ({ value }) => {
|
|
623
|
+
try {
|
|
624
|
+
await sendPasswordResetEmail(this.ui(), value.email);
|
|
625
|
+
this.emailSent.set(true);
|
|
626
|
+
this.passwordSent?.emit();
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
catch (error) {
|
|
630
|
+
if (error instanceof FirebaseUIError) {
|
|
631
|
+
return error.message;
|
|
632
|
+
}
|
|
633
|
+
return this.unknownErrorLabel();
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
},
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ForgotPasswordAuthFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
641
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: ForgotPasswordAuthFormComponent, isStandalone: true, selector: "fui-forgot-password-auth-form", outputs: { passwordSent: "passwordSent", backToSignIn: "backToSignIn" }, ngImport: i0, template: `
|
|
642
|
+
@if (emailSent()) {
|
|
643
|
+
<div class="fui-form__success">
|
|
644
|
+
{{ checkEmailForResetMessage() }}
|
|
645
|
+
</div>
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
@if (!emailSent()) {
|
|
649
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
650
|
+
<fieldset>
|
|
651
|
+
<fui-form-input name="email" tanstack-app-field [tanstackField]="form" label="{{ emailLabel() }}" />
|
|
652
|
+
</fieldset>
|
|
653
|
+
|
|
654
|
+
<fui-policies />
|
|
655
|
+
|
|
656
|
+
<fieldset>
|
|
657
|
+
<fui-form-submit [state]="state()">
|
|
658
|
+
{{ resetPasswordLabel() }}
|
|
659
|
+
</fui-form-submit>
|
|
660
|
+
<fui-form-error-message [state]="state()" />
|
|
661
|
+
</fieldset>
|
|
662
|
+
|
|
663
|
+
@if (backToSignIn) {
|
|
664
|
+
<button fui-form-action (click)="backToSignIn.emit()">{{ backToSignInLabel() }} →</button>
|
|
665
|
+
}
|
|
666
|
+
</form>
|
|
667
|
+
}
|
|
668
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }, { kind: "component", type: FormActionComponent, selector: "button[fui-form-action]" }] });
|
|
669
|
+
}
|
|
670
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ForgotPasswordAuthFormComponent, decorators: [{
|
|
671
|
+
type: Component,
|
|
672
|
+
args: [{
|
|
673
|
+
selector: "fui-forgot-password-auth-form",
|
|
674
|
+
standalone: true,
|
|
675
|
+
imports: [
|
|
676
|
+
CommonModule,
|
|
677
|
+
TanStackField,
|
|
678
|
+
TanStackAppField,
|
|
679
|
+
PoliciesComponent,
|
|
680
|
+
FormInputComponent,
|
|
681
|
+
FormSubmitComponent,
|
|
682
|
+
FormErrorMessageComponent,
|
|
683
|
+
FormActionComponent,
|
|
684
|
+
],
|
|
685
|
+
template: `
|
|
686
|
+
@if (emailSent()) {
|
|
687
|
+
<div class="fui-form__success">
|
|
688
|
+
{{ checkEmailForResetMessage() }}
|
|
689
|
+
</div>
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
@if (!emailSent()) {
|
|
693
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
694
|
+
<fieldset>
|
|
695
|
+
<fui-form-input name="email" tanstack-app-field [tanstackField]="form" label="{{ emailLabel() }}" />
|
|
696
|
+
</fieldset>
|
|
697
|
+
|
|
698
|
+
<fui-policies />
|
|
699
|
+
|
|
700
|
+
<fieldset>
|
|
701
|
+
<fui-form-submit [state]="state()">
|
|
702
|
+
{{ resetPasswordLabel() }}
|
|
703
|
+
</fui-form-submit>
|
|
704
|
+
<fui-form-error-message [state]="state()" />
|
|
705
|
+
</fieldset>
|
|
706
|
+
|
|
707
|
+
@if (backToSignIn) {
|
|
708
|
+
<button fui-form-action (click)="backToSignIn.emit()">{{ backToSignInLabel() }} →</button>
|
|
709
|
+
}
|
|
710
|
+
</form>
|
|
711
|
+
}
|
|
712
|
+
`,
|
|
713
|
+
}]
|
|
714
|
+
}], ctorParameters: () => [], propDecorators: { passwordSent: [{ type: i0.Output, args: ["passwordSent"] }], backToSignIn: [{ type: i0.Output, args: ["backToSignIn"] }] } });
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* Copyright 2025 Google LLC
|
|
718
|
+
*
|
|
719
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
720
|
+
* you may not use this file except in compliance with the License.
|
|
721
|
+
* You may obtain a copy of the License at
|
|
722
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
723
|
+
*
|
|
724
|
+
* Unless required by applicable law or agreed to writing, software
|
|
725
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
726
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
727
|
+
* See the License for the specific language governing permissions and
|
|
728
|
+
* limitations under the License.
|
|
729
|
+
*/
|
|
730
|
+
class SmsMultiFactorAssertionPhoneFormComponent {
|
|
731
|
+
ui = injectUI();
|
|
732
|
+
formSchema = injectMultiFactorPhoneAuthNumberFormSchema();
|
|
733
|
+
hint = input.required(...(ngDevMode ? [{ debugName: "hint" }] : []));
|
|
734
|
+
onSubmit = output();
|
|
735
|
+
phoneNumberLabel = injectTranslation("labels", "phoneNumber");
|
|
736
|
+
sendCodeLabel = injectTranslation("labels", "sendCode");
|
|
737
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
738
|
+
recaptchaContainer = viewChild.required("recaptchaContainer");
|
|
739
|
+
phoneNumber = computed(() => {
|
|
740
|
+
const hint = this.hint();
|
|
741
|
+
return hint.phoneNumber || "";
|
|
742
|
+
}, ...(ngDevMode ? [{ debugName: "phoneNumber" }] : []));
|
|
743
|
+
recaptchaVerifier = injectRecaptchaVerifier(() => this.recaptchaContainer());
|
|
744
|
+
form = injectForm({
|
|
745
|
+
defaultValues: {
|
|
746
|
+
phoneNumber: "",
|
|
747
|
+
},
|
|
748
|
+
});
|
|
749
|
+
state = injectStore(this.form, (state) => state);
|
|
750
|
+
constructor() {
|
|
751
|
+
effect(() => {
|
|
752
|
+
// Set the phone number value from the hint
|
|
753
|
+
this.form.setFieldValue("phoneNumber", this.phoneNumber());
|
|
754
|
+
});
|
|
755
|
+
effect(() => {
|
|
756
|
+
this.form.update({
|
|
757
|
+
validators: {
|
|
758
|
+
onBlur: this.formSchema(),
|
|
759
|
+
onSubmit: this.formSchema(),
|
|
760
|
+
onSubmitAsync: async () => {
|
|
761
|
+
try {
|
|
762
|
+
const verifier = this.recaptchaVerifier();
|
|
763
|
+
if (!verifier) {
|
|
764
|
+
return this.unknownErrorLabel();
|
|
765
|
+
}
|
|
766
|
+
const verificationId = await verifyPhoneNumber(this.ui(), "", verifier, undefined, this.hint());
|
|
767
|
+
this.onSubmit.emit(verificationId);
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
catch (error) {
|
|
771
|
+
if (error instanceof FirebaseUIError) {
|
|
772
|
+
return error.message;
|
|
773
|
+
}
|
|
774
|
+
return this.unknownErrorLabel();
|
|
775
|
+
}
|
|
776
|
+
},
|
|
777
|
+
},
|
|
778
|
+
});
|
|
779
|
+
});
|
|
780
|
+
effect((onCleanup) => {
|
|
781
|
+
const verifier = this.recaptchaVerifier();
|
|
782
|
+
onCleanup(() => {
|
|
783
|
+
if (verifier) {
|
|
784
|
+
verifier.clear();
|
|
785
|
+
}
|
|
786
|
+
});
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
async handleSubmit(event) {
|
|
790
|
+
event.preventDefault();
|
|
791
|
+
event.stopPropagation();
|
|
792
|
+
this.form.handleSubmit();
|
|
793
|
+
}
|
|
794
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SmsMultiFactorAssertionPhoneFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
795
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.7", type: SmsMultiFactorAssertionPhoneFormComponent, isStandalone: true, selector: "fui-sms-multi-factor-assertion-phone-form", inputs: { hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "recaptchaContainer", first: true, predicate: ["recaptchaContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
796
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
797
|
+
<fieldset>
|
|
798
|
+
<fui-form-input
|
|
799
|
+
name="phoneNumber"
|
|
800
|
+
tanstack-app-field
|
|
801
|
+
[tanstackField]="form"
|
|
802
|
+
label="{{ phoneNumberLabel() }}"
|
|
803
|
+
type="tel"
|
|
804
|
+
></fui-form-input>
|
|
805
|
+
</fieldset>
|
|
806
|
+
<fieldset>
|
|
807
|
+
<div class="fui-recaptcha-container" #recaptchaContainer></div>
|
|
808
|
+
</fieldset>
|
|
809
|
+
<fieldset>
|
|
810
|
+
<fui-form-submit [state]="state()">
|
|
811
|
+
{{ sendCodeLabel() }}
|
|
812
|
+
</fui-form-submit>
|
|
813
|
+
<fui-form-error-message [state]="state()" />
|
|
814
|
+
</fieldset>
|
|
815
|
+
</form>
|
|
816
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }] });
|
|
817
|
+
}
|
|
818
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SmsMultiFactorAssertionPhoneFormComponent, decorators: [{
|
|
819
|
+
type: Component,
|
|
820
|
+
args: [{
|
|
821
|
+
selector: "fui-sms-multi-factor-assertion-phone-form",
|
|
822
|
+
standalone: true,
|
|
823
|
+
imports: [
|
|
824
|
+
CommonModule,
|
|
825
|
+
TanStackField,
|
|
826
|
+
TanStackAppField,
|
|
827
|
+
FormInputComponent,
|
|
828
|
+
FormSubmitComponent,
|
|
829
|
+
FormErrorMessageComponent,
|
|
830
|
+
],
|
|
831
|
+
template: `
|
|
832
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
833
|
+
<fieldset>
|
|
834
|
+
<fui-form-input
|
|
835
|
+
name="phoneNumber"
|
|
836
|
+
tanstack-app-field
|
|
837
|
+
[tanstackField]="form"
|
|
838
|
+
label="{{ phoneNumberLabel() }}"
|
|
839
|
+
type="tel"
|
|
840
|
+
></fui-form-input>
|
|
841
|
+
</fieldset>
|
|
842
|
+
<fieldset>
|
|
843
|
+
<div class="fui-recaptcha-container" #recaptchaContainer></div>
|
|
844
|
+
</fieldset>
|
|
845
|
+
<fieldset>
|
|
846
|
+
<fui-form-submit [state]="state()">
|
|
847
|
+
{{ sendCodeLabel() }}
|
|
848
|
+
</fui-form-submit>
|
|
849
|
+
<fui-form-error-message [state]="state()" />
|
|
850
|
+
</fieldset>
|
|
851
|
+
</form>
|
|
852
|
+
`,
|
|
853
|
+
}]
|
|
854
|
+
}], ctorParameters: () => [], propDecorators: { hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: true }] }], onSubmit: [{ type: i0.Output, args: ["onSubmit"] }], recaptchaContainer: [{ type: i0.ViewChild, args: ["recaptchaContainer", { isSignal: true }] }] } });
|
|
855
|
+
class SmsMultiFactorAssertionVerifyFormComponent {
|
|
856
|
+
ui = injectUI();
|
|
857
|
+
formSchema = injectMultiFactorPhoneAuthVerifyFormSchema();
|
|
858
|
+
verificationId = input.required(...(ngDevMode ? [{ debugName: "verificationId" }] : []));
|
|
859
|
+
onSuccess = output();
|
|
860
|
+
verificationCodeLabel = injectTranslation("labels", "verificationCode");
|
|
861
|
+
verifyCodeLabel = injectTranslation("labels", "verifyCode");
|
|
862
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
863
|
+
form = injectForm({
|
|
864
|
+
defaultValues: {
|
|
865
|
+
verificationId: "",
|
|
866
|
+
verificationCode: "",
|
|
867
|
+
},
|
|
868
|
+
});
|
|
869
|
+
state = injectStore(this.form, (state) => state);
|
|
870
|
+
constructor() {
|
|
871
|
+
effect(() => {
|
|
872
|
+
this.form.setFieldValue("verificationId", this.verificationId());
|
|
873
|
+
});
|
|
874
|
+
effect(() => {
|
|
875
|
+
this.form.update({
|
|
876
|
+
validators: {
|
|
877
|
+
onBlur: this.formSchema(),
|
|
878
|
+
onSubmit: this.formSchema(),
|
|
879
|
+
onSubmitAsync: async ({ value }) => {
|
|
880
|
+
try {
|
|
881
|
+
const credential = PhoneAuthProvider.credential(value.verificationId, value.verificationCode);
|
|
882
|
+
const assertion = PhoneMultiFactorGenerator.assertion(credential);
|
|
883
|
+
await signInWithMultiFactorAssertion(this.ui(), assertion);
|
|
884
|
+
this.onSuccess.emit();
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
887
|
+
catch (error) {
|
|
888
|
+
if (error instanceof FirebaseUIError) {
|
|
889
|
+
return error.message;
|
|
890
|
+
}
|
|
891
|
+
return this.unknownErrorLabel();
|
|
892
|
+
}
|
|
893
|
+
},
|
|
894
|
+
},
|
|
895
|
+
});
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
async handleSubmit(event) {
|
|
899
|
+
event.preventDefault();
|
|
900
|
+
event.stopPropagation();
|
|
901
|
+
this.form.handleSubmit();
|
|
902
|
+
}
|
|
903
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SmsMultiFactorAssertionVerifyFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
904
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: SmsMultiFactorAssertionVerifyFormComponent, isStandalone: true, selector: "fui-sms-multi-factor-assertion-verify-form", inputs: { verificationId: { classPropertyName: "verificationId", publicName: "verificationId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onSuccess: "onSuccess" }, ngImport: i0, template: `
|
|
905
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
906
|
+
<fieldset>
|
|
907
|
+
<fui-form-input
|
|
908
|
+
name="verificationCode"
|
|
909
|
+
tanstack-app-field
|
|
910
|
+
[tanstackField]="form"
|
|
911
|
+
label="{{ verificationCodeLabel() }}"
|
|
912
|
+
type="text"
|
|
913
|
+
></fui-form-input>
|
|
914
|
+
</fieldset>
|
|
915
|
+
<fieldset>
|
|
916
|
+
<fui-form-submit [state]="state()">
|
|
917
|
+
{{ verifyCodeLabel() }}
|
|
918
|
+
</fui-form-submit>
|
|
919
|
+
<fui-form-error-message [state]="state()" />
|
|
920
|
+
</fieldset>
|
|
921
|
+
</form>
|
|
922
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }] });
|
|
923
|
+
}
|
|
924
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SmsMultiFactorAssertionVerifyFormComponent, decorators: [{
|
|
925
|
+
type: Component,
|
|
926
|
+
args: [{
|
|
927
|
+
selector: "fui-sms-multi-factor-assertion-verify-form",
|
|
928
|
+
standalone: true,
|
|
929
|
+
imports: [
|
|
930
|
+
CommonModule,
|
|
931
|
+
TanStackField,
|
|
932
|
+
TanStackAppField,
|
|
933
|
+
FormInputComponent,
|
|
934
|
+
FormSubmitComponent,
|
|
935
|
+
FormErrorMessageComponent,
|
|
936
|
+
],
|
|
937
|
+
template: `
|
|
938
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
939
|
+
<fieldset>
|
|
940
|
+
<fui-form-input
|
|
941
|
+
name="verificationCode"
|
|
942
|
+
tanstack-app-field
|
|
943
|
+
[tanstackField]="form"
|
|
944
|
+
label="{{ verificationCodeLabel() }}"
|
|
945
|
+
type="text"
|
|
946
|
+
></fui-form-input>
|
|
947
|
+
</fieldset>
|
|
948
|
+
<fieldset>
|
|
949
|
+
<fui-form-submit [state]="state()">
|
|
950
|
+
{{ verifyCodeLabel() }}
|
|
951
|
+
</fui-form-submit>
|
|
952
|
+
<fui-form-error-message [state]="state()" />
|
|
953
|
+
</fieldset>
|
|
954
|
+
</form>
|
|
955
|
+
`,
|
|
956
|
+
}]
|
|
957
|
+
}], ctorParameters: () => [], propDecorators: { verificationId: [{ type: i0.Input, args: [{ isSignal: true, alias: "verificationId", required: true }] }], onSuccess: [{ type: i0.Output, args: ["onSuccess"] }] } });
|
|
958
|
+
class SmsMultiFactorAssertionFormComponent {
|
|
959
|
+
hint = input.required(...(ngDevMode ? [{ debugName: "hint" }] : []));
|
|
960
|
+
onSuccess = output();
|
|
961
|
+
verification = signal(null, ...(ngDevMode ? [{ debugName: "verification" }] : []));
|
|
962
|
+
handlePhoneSubmit(verificationId) {
|
|
963
|
+
this.verification.set({ verificationId });
|
|
964
|
+
}
|
|
965
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SmsMultiFactorAssertionFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
966
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: SmsMultiFactorAssertionFormComponent, isStandalone: true, selector: "fui-sms-multi-factor-assertion-form", inputs: { hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onSuccess: "onSuccess" }, ngImport: i0, template: `
|
|
967
|
+
<div class="fui-content">
|
|
968
|
+
@if (verification()) {
|
|
969
|
+
<fui-sms-multi-factor-assertion-verify-form
|
|
970
|
+
[verificationId]="verification()!.verificationId"
|
|
971
|
+
(onSuccess)="onSuccess.emit()"
|
|
972
|
+
/>
|
|
973
|
+
} @else {
|
|
974
|
+
<fui-sms-multi-factor-assertion-phone-form [hint]="hint()" (onSubmit)="handlePhoneSubmit($event)" />
|
|
975
|
+
}
|
|
976
|
+
</div>
|
|
977
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SmsMultiFactorAssertionPhoneFormComponent, selector: "fui-sms-multi-factor-assertion-phone-form", inputs: ["hint"], outputs: ["onSubmit"] }, { kind: "component", type: SmsMultiFactorAssertionVerifyFormComponent, selector: "fui-sms-multi-factor-assertion-verify-form", inputs: ["verificationId"], outputs: ["onSuccess"] }] });
|
|
978
|
+
}
|
|
979
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SmsMultiFactorAssertionFormComponent, decorators: [{
|
|
980
|
+
type: Component,
|
|
981
|
+
args: [{
|
|
982
|
+
selector: "fui-sms-multi-factor-assertion-form",
|
|
983
|
+
standalone: true,
|
|
984
|
+
imports: [CommonModule, SmsMultiFactorAssertionPhoneFormComponent, SmsMultiFactorAssertionVerifyFormComponent],
|
|
985
|
+
template: `
|
|
986
|
+
<div class="fui-content">
|
|
987
|
+
@if (verification()) {
|
|
988
|
+
<fui-sms-multi-factor-assertion-verify-form
|
|
989
|
+
[verificationId]="verification()!.verificationId"
|
|
990
|
+
(onSuccess)="onSuccess.emit()"
|
|
991
|
+
/>
|
|
992
|
+
} @else {
|
|
993
|
+
<fui-sms-multi-factor-assertion-phone-form [hint]="hint()" (onSubmit)="handlePhoneSubmit($event)" />
|
|
994
|
+
}
|
|
995
|
+
</div>
|
|
996
|
+
`,
|
|
997
|
+
}]
|
|
998
|
+
}], propDecorators: { hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: true }] }], onSuccess: [{ type: i0.Output, args: ["onSuccess"] }] } });
|
|
999
|
+
|
|
1000
|
+
/**
|
|
1001
|
+
* Copyright 2025 Google LLC
|
|
1002
|
+
*
|
|
1003
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1004
|
+
* you may not use this file except in compliance with the License.
|
|
1005
|
+
* You may obtain a copy of the License at
|
|
1006
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1007
|
+
*
|
|
1008
|
+
* Unless required by applicable law or agreed to writing, software
|
|
1009
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1010
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1011
|
+
* See the License for the specific language governing permissions and
|
|
1012
|
+
* limitations under the License.
|
|
1013
|
+
*/
|
|
1014
|
+
class TotpMultiFactorAssertionFormComponent {
|
|
1015
|
+
ui = injectUI();
|
|
1016
|
+
formSchema = injectMultiFactorTotpAuthVerifyFormSchema();
|
|
1017
|
+
hint = input.required(...(ngDevMode ? [{ debugName: "hint" }] : []));
|
|
1018
|
+
onSuccess = output();
|
|
1019
|
+
verificationCodeLabel = injectTranslation("labels", "verificationCode");
|
|
1020
|
+
verifyCodeLabel = injectTranslation("labels", "verifyCode");
|
|
1021
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
1022
|
+
form = injectForm({
|
|
1023
|
+
defaultValues: {
|
|
1024
|
+
verificationCode: "",
|
|
1025
|
+
},
|
|
1026
|
+
});
|
|
1027
|
+
state = injectStore(this.form, (state) => state);
|
|
1028
|
+
constructor() {
|
|
1029
|
+
effect(() => {
|
|
1030
|
+
this.form.update({
|
|
1031
|
+
validators: {
|
|
1032
|
+
onBlur: this.formSchema(),
|
|
1033
|
+
onSubmit: this.formSchema(),
|
|
1034
|
+
onSubmitAsync: async ({ value }) => {
|
|
1035
|
+
try {
|
|
1036
|
+
const assertion = TotpMultiFactorGenerator.assertionForSignIn(this.hint().uid, value.verificationCode);
|
|
1037
|
+
await signInWithMultiFactorAssertion(this.ui(), assertion);
|
|
1038
|
+
this.onSuccess.emit();
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
catch (error) {
|
|
1042
|
+
if (error instanceof FirebaseUIError) {
|
|
1043
|
+
return error.message;
|
|
1044
|
+
}
|
|
1045
|
+
return this.unknownErrorLabel();
|
|
1046
|
+
}
|
|
1047
|
+
},
|
|
1048
|
+
},
|
|
1049
|
+
});
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
async handleSubmit(event) {
|
|
1053
|
+
event.preventDefault();
|
|
1054
|
+
event.stopPropagation();
|
|
1055
|
+
this.form.handleSubmit();
|
|
1056
|
+
}
|
|
1057
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: TotpMultiFactorAssertionFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1058
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: TotpMultiFactorAssertionFormComponent, isStandalone: true, selector: "fui-totp-multi-factor-assertion-form", inputs: { hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onSuccess: "onSuccess" }, ngImport: i0, template: `
|
|
1059
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1060
|
+
<fieldset>
|
|
1061
|
+
<fui-form-input
|
|
1062
|
+
name="verificationCode"
|
|
1063
|
+
tanstack-app-field
|
|
1064
|
+
[tanstackField]="form"
|
|
1065
|
+
label="{{ verificationCodeLabel() }}"
|
|
1066
|
+
type="text"
|
|
1067
|
+
placeholder="123456"
|
|
1068
|
+
maxlength="6"
|
|
1069
|
+
></fui-form-input>
|
|
1070
|
+
</fieldset>
|
|
1071
|
+
<fieldset>
|
|
1072
|
+
<fui-form-submit [state]="state()">
|
|
1073
|
+
{{ verifyCodeLabel() }}
|
|
1074
|
+
</fui-form-submit>
|
|
1075
|
+
<fui-form-error-message [state]="state()" />
|
|
1076
|
+
</fieldset>
|
|
1077
|
+
</form>
|
|
1078
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }] });
|
|
1079
|
+
}
|
|
1080
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: TotpMultiFactorAssertionFormComponent, decorators: [{
|
|
1081
|
+
type: Component,
|
|
1082
|
+
args: [{
|
|
1083
|
+
selector: "fui-totp-multi-factor-assertion-form",
|
|
1084
|
+
standalone: true,
|
|
1085
|
+
imports: [
|
|
1086
|
+
CommonModule,
|
|
1087
|
+
TanStackField,
|
|
1088
|
+
TanStackAppField,
|
|
1089
|
+
FormInputComponent,
|
|
1090
|
+
FormSubmitComponent,
|
|
1091
|
+
FormErrorMessageComponent,
|
|
1092
|
+
],
|
|
1093
|
+
template: `
|
|
1094
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1095
|
+
<fieldset>
|
|
1096
|
+
<fui-form-input
|
|
1097
|
+
name="verificationCode"
|
|
1098
|
+
tanstack-app-field
|
|
1099
|
+
[tanstackField]="form"
|
|
1100
|
+
label="{{ verificationCodeLabel() }}"
|
|
1101
|
+
type="text"
|
|
1102
|
+
placeholder="123456"
|
|
1103
|
+
maxlength="6"
|
|
1104
|
+
></fui-form-input>
|
|
1105
|
+
</fieldset>
|
|
1106
|
+
<fieldset>
|
|
1107
|
+
<fui-form-submit [state]="state()">
|
|
1108
|
+
{{ verifyCodeLabel() }}
|
|
1109
|
+
</fui-form-submit>
|
|
1110
|
+
<fui-form-error-message [state]="state()" />
|
|
1111
|
+
</fieldset>
|
|
1112
|
+
</form>
|
|
1113
|
+
`,
|
|
1114
|
+
}]
|
|
1115
|
+
}], ctorParameters: () => [], propDecorators: { hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: true }] }], onSuccess: [{ type: i0.Output, args: ["onSuccess"] }] } });
|
|
1116
|
+
|
|
1117
|
+
/**
|
|
1118
|
+
* Copyright 2025 Google LLC
|
|
1119
|
+
*
|
|
1120
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1121
|
+
* you may not use this file except in compliance with the License.
|
|
1122
|
+
* You may obtain a copy of the License at
|
|
1123
|
+
*
|
|
1124
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1125
|
+
*
|
|
1126
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1127
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1128
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1129
|
+
* See the License for the specific language governing permissions and
|
|
1130
|
+
* limitations under the License.
|
|
1131
|
+
*/
|
|
1132
|
+
class MultiFactorAuthAssertionFormComponent {
|
|
1133
|
+
ui = injectUI();
|
|
1134
|
+
resolver = computed(() => {
|
|
1135
|
+
const resolver = this.ui().multiFactorResolver;
|
|
1136
|
+
if (!resolver) {
|
|
1137
|
+
throw new Error("MultiFactorAuthAssertionForm requires a multi-factor resolver");
|
|
1138
|
+
}
|
|
1139
|
+
return resolver;
|
|
1140
|
+
}, ...(ngDevMode ? [{ debugName: "resolver" }] : []));
|
|
1141
|
+
selectedHint = signal(this.resolver().hints.length === 1 ? this.resolver().hints[0] : undefined, ...(ngDevMode ? [{ debugName: "selectedHint" }] : []));
|
|
1142
|
+
phoneFactorId = computed(() => PhoneMultiFactorGenerator.FACTOR_ID, ...(ngDevMode ? [{ debugName: "phoneFactorId" }] : []));
|
|
1143
|
+
totpFactorId = computed(() => TotpMultiFactorGenerator.FACTOR_ID, ...(ngDevMode ? [{ debugName: "totpFactorId" }] : []));
|
|
1144
|
+
smsVerificationLabel = injectTranslation("labels", "mfaSmsVerification");
|
|
1145
|
+
totpVerificationLabel = injectTranslation("labels", "mfaTotpVerification");
|
|
1146
|
+
selectHint(hint) {
|
|
1147
|
+
this.selectedHint.set(hint);
|
|
1148
|
+
}
|
|
1149
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: MultiFactorAuthAssertionFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1150
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: MultiFactorAuthAssertionFormComponent, isStandalone: true, selector: "fui-multi-factor-auth-assertion-form", ngImport: i0, template: `
|
|
1151
|
+
<div class="fui-content">
|
|
1152
|
+
@if (selectedHint()) {
|
|
1153
|
+
@if (selectedHint()!.factorId === phoneFactorId()) {
|
|
1154
|
+
<fui-sms-multi-factor-assertion-form [hint]="selectedHint()!" />
|
|
1155
|
+
} @else if (selectedHint()!.factorId === totpFactorId()) {
|
|
1156
|
+
<fui-totp-multi-factor-assertion-form [hint]="selectedHint()!" />
|
|
1157
|
+
}
|
|
1158
|
+
} @else {
|
|
1159
|
+
<p>TODO: Select a multi-factor authentication method</p>
|
|
1160
|
+
@for (hint of resolver().hints; track hint.factorId) {
|
|
1161
|
+
@if (hint.factorId === totpFactorId()) {
|
|
1162
|
+
<button fui-button (click)="selectHint(hint)">
|
|
1163
|
+
{{ totpVerificationLabel() }}
|
|
1164
|
+
</button>
|
|
1165
|
+
} @else if (hint.factorId === phoneFactorId()) {
|
|
1166
|
+
<button fui-button (click)="selectHint(hint)">
|
|
1167
|
+
{{ smsVerificationLabel() }}
|
|
1168
|
+
</button>
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
</div>
|
|
1173
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SmsMultiFactorAssertionFormComponent, selector: "fui-sms-multi-factor-assertion-form", inputs: ["hint"], outputs: ["onSuccess"] }, { kind: "component", type: TotpMultiFactorAssertionFormComponent, selector: "fui-totp-multi-factor-assertion-form", inputs: ["hint"], outputs: ["onSuccess"] }, { kind: "component", type: ButtonComponent, selector: "button[fui-button]", inputs: ["variant"] }] });
|
|
1174
|
+
}
|
|
1175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: MultiFactorAuthAssertionFormComponent, decorators: [{
|
|
1176
|
+
type: Component,
|
|
1177
|
+
args: [{
|
|
1178
|
+
selector: "fui-multi-factor-auth-assertion-form",
|
|
1179
|
+
standalone: true,
|
|
1180
|
+
imports: [CommonModule, SmsMultiFactorAssertionFormComponent, TotpMultiFactorAssertionFormComponent, ButtonComponent],
|
|
1181
|
+
template: `
|
|
1182
|
+
<div class="fui-content">
|
|
1183
|
+
@if (selectedHint()) {
|
|
1184
|
+
@if (selectedHint()!.factorId === phoneFactorId()) {
|
|
1185
|
+
<fui-sms-multi-factor-assertion-form [hint]="selectedHint()!" />
|
|
1186
|
+
} @else if (selectedHint()!.factorId === totpFactorId()) {
|
|
1187
|
+
<fui-totp-multi-factor-assertion-form [hint]="selectedHint()!" />
|
|
1188
|
+
}
|
|
1189
|
+
} @else {
|
|
1190
|
+
<p>TODO: Select a multi-factor authentication method</p>
|
|
1191
|
+
@for (hint of resolver().hints; track hint.factorId) {
|
|
1192
|
+
@if (hint.factorId === totpFactorId()) {
|
|
1193
|
+
<button fui-button (click)="selectHint(hint)">
|
|
1194
|
+
{{ totpVerificationLabel() }}
|
|
1195
|
+
</button>
|
|
1196
|
+
} @else if (hint.factorId === phoneFactorId()) {
|
|
1197
|
+
<button fui-button (click)="selectHint(hint)">
|
|
1198
|
+
{{ smsVerificationLabel() }}
|
|
1199
|
+
</button>
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
</div>
|
|
1204
|
+
`,
|
|
1205
|
+
}]
|
|
1206
|
+
}] });
|
|
1207
|
+
|
|
1208
|
+
/**
|
|
1209
|
+
* Copyright 2025 Google LLC
|
|
1210
|
+
*
|
|
1211
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1212
|
+
* you may not use this file except in compliance with the License.
|
|
1213
|
+
* You may obtain a copy of the License at
|
|
1214
|
+
*
|
|
1215
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1216
|
+
*
|
|
1217
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1218
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1219
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1220
|
+
* See the License for the specific language governing permissions and
|
|
1221
|
+
* limitations under the License.
|
|
1222
|
+
*/
|
|
1223
|
+
class CountrySelectorComponent {
|
|
1224
|
+
countries = injectCountries();
|
|
1225
|
+
defaultCountry = injectDefaultCountry();
|
|
1226
|
+
value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : []));
|
|
1227
|
+
selected = computed(() => {
|
|
1228
|
+
if (!this.value()) {
|
|
1229
|
+
return this.defaultCountry();
|
|
1230
|
+
}
|
|
1231
|
+
return this.countries().find((c) => c.code === this.value()) || this.defaultCountry();
|
|
1232
|
+
}, ...(ngDevMode ? [{ debugName: "selected" }] : []));
|
|
1233
|
+
handleCountryChange(code) {
|
|
1234
|
+
const country = this.countries().find((c) => c.code === code);
|
|
1235
|
+
if (country) {
|
|
1236
|
+
this.value.update(() => country.code);
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CountrySelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1240
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: CountrySelectorComponent, isStandalone: true, selector: "fui-country-selector", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: `
|
|
1241
|
+
<div class="fui-country-selector">
|
|
1242
|
+
<div class="fui-country-selector__wrapper">
|
|
1243
|
+
<span class="fui-country-selector__flag">{{ selected().emoji }}</span>
|
|
1244
|
+
<div class="fui-country-selector__select-wrapper">
|
|
1245
|
+
<span class="fui-country-selector__dial-code">{{ selected().dialCode }}</span>
|
|
1246
|
+
<select
|
|
1247
|
+
class="fui-country-selector__select"
|
|
1248
|
+
[ngModel]="selected().code"
|
|
1249
|
+
(ngModelChange)="handleCountryChange($event)"
|
|
1250
|
+
>
|
|
1251
|
+
@for (country of countries(); track country.code) {
|
|
1252
|
+
<option [value]="country.code">{{ country.dialCode }} ({{ country.name }})</option>
|
|
1253
|
+
}
|
|
1254
|
+
</select>
|
|
1255
|
+
</div>
|
|
1256
|
+
</div>
|
|
1257
|
+
</div>
|
|
1258
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
1259
|
+
}
|
|
1260
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CountrySelectorComponent, decorators: [{
|
|
1261
|
+
type: Component,
|
|
1262
|
+
args: [{
|
|
1263
|
+
selector: "fui-country-selector",
|
|
1264
|
+
standalone: true,
|
|
1265
|
+
imports: [CommonModule, FormsModule],
|
|
1266
|
+
template: `
|
|
1267
|
+
<div class="fui-country-selector">
|
|
1268
|
+
<div class="fui-country-selector__wrapper">
|
|
1269
|
+
<span class="fui-country-selector__flag">{{ selected().emoji }}</span>
|
|
1270
|
+
<div class="fui-country-selector__select-wrapper">
|
|
1271
|
+
<span class="fui-country-selector__dial-code">{{ selected().dialCode }}</span>
|
|
1272
|
+
<select
|
|
1273
|
+
class="fui-country-selector__select"
|
|
1274
|
+
[ngModel]="selected().code"
|
|
1275
|
+
(ngModelChange)="handleCountryChange($event)"
|
|
1276
|
+
>
|
|
1277
|
+
@for (country of countries(); track country.code) {
|
|
1278
|
+
<option [value]="country.code">{{ country.dialCode }} ({{ country.name }})</option>
|
|
1279
|
+
}
|
|
1280
|
+
</select>
|
|
1281
|
+
</div>
|
|
1282
|
+
</div>
|
|
1283
|
+
</div>
|
|
1284
|
+
`,
|
|
1285
|
+
}]
|
|
1286
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
|
|
1287
|
+
|
|
1288
|
+
/**
|
|
1289
|
+
* Copyright 2025 Google LLC
|
|
1290
|
+
*
|
|
1291
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1292
|
+
* you may not use this file except in compliance with the License.
|
|
1293
|
+
* You may obtain a copy of the License at
|
|
1294
|
+
*
|
|
1295
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1296
|
+
*
|
|
1297
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1298
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1299
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1300
|
+
* See the License for the specific language governing permissions and
|
|
1301
|
+
* limitations under the License.
|
|
1302
|
+
*/
|
|
1303
|
+
class PhoneNumberFormComponent {
|
|
1304
|
+
ui = injectUI();
|
|
1305
|
+
formSchema = injectPhoneAuthFormSchema();
|
|
1306
|
+
onSubmit = output();
|
|
1307
|
+
country = signal(countryData[0].code, ...(ngDevMode ? [{ debugName: "country" }] : []));
|
|
1308
|
+
phoneNumberLabel = injectTranslation("labels", "phoneNumber");
|
|
1309
|
+
sendCodeLabel = injectTranslation("labels", "sendCode");
|
|
1310
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
1311
|
+
recaptchaContainer = viewChild.required("recaptchaContainer");
|
|
1312
|
+
recaptchaVerifier = injectRecaptchaVerifier(() => this.recaptchaContainer());
|
|
1313
|
+
form = injectForm({
|
|
1314
|
+
defaultValues: {
|
|
1315
|
+
phoneNumber: "",
|
|
1316
|
+
},
|
|
1317
|
+
});
|
|
1318
|
+
state = injectStore(this.form, (state) => state);
|
|
1319
|
+
constructor() {
|
|
1320
|
+
effect(() => {
|
|
1321
|
+
this.form.update({
|
|
1322
|
+
validators: {
|
|
1323
|
+
onBlur: this.formSchema(),
|
|
1324
|
+
onSubmit: this.formSchema(),
|
|
1325
|
+
onSubmitAsync: async ({ value }) => {
|
|
1326
|
+
const selectedCountry = countryData.find((c) => c.code === this.country());
|
|
1327
|
+
const formattedNumber = formatPhoneNumber(value.phoneNumber, selectedCountry);
|
|
1328
|
+
try {
|
|
1329
|
+
const verifier = this.recaptchaVerifier();
|
|
1330
|
+
if (!verifier) {
|
|
1331
|
+
return this.unknownErrorLabel();
|
|
1332
|
+
}
|
|
1333
|
+
const verificationId = await verifyPhoneNumber(this.ui(), formattedNumber, verifier);
|
|
1334
|
+
this.onSubmit.emit({ verificationId, phoneNumber: formattedNumber });
|
|
1335
|
+
return;
|
|
1336
|
+
}
|
|
1337
|
+
catch (error) {
|
|
1338
|
+
if (error instanceof FirebaseUIError) {
|
|
1339
|
+
return error.message;
|
|
1340
|
+
}
|
|
1341
|
+
return this.unknownErrorLabel();
|
|
1342
|
+
}
|
|
1343
|
+
},
|
|
1344
|
+
},
|
|
1345
|
+
});
|
|
1346
|
+
});
|
|
1347
|
+
effect((onCleanup) => {
|
|
1348
|
+
const verifier = this.recaptchaVerifier();
|
|
1349
|
+
onCleanup(() => {
|
|
1350
|
+
if (verifier) {
|
|
1351
|
+
verifier.clear();
|
|
1352
|
+
}
|
|
1353
|
+
});
|
|
1354
|
+
});
|
|
1355
|
+
}
|
|
1356
|
+
async handleSubmit(event) {
|
|
1357
|
+
event.preventDefault();
|
|
1358
|
+
event.stopPropagation();
|
|
1359
|
+
this.form.handleSubmit();
|
|
1360
|
+
}
|
|
1361
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PhoneNumberFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1362
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.7", type: PhoneNumberFormComponent, isStandalone: true, selector: "fui-phone-number-form", outputs: { onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "recaptchaContainer", first: true, predicate: ["recaptchaContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
1363
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1364
|
+
<fieldset>
|
|
1365
|
+
<fui-country-selector [(value)]="country"></fui-country-selector>
|
|
1366
|
+
<fui-form-input
|
|
1367
|
+
name="phoneNumber"
|
|
1368
|
+
tanstack-app-field
|
|
1369
|
+
[tanstackField]="form"
|
|
1370
|
+
label="{{ phoneNumberLabel() }}"
|
|
1371
|
+
></fui-form-input>
|
|
1372
|
+
</fieldset>
|
|
1373
|
+
<fieldset>
|
|
1374
|
+
<div class="fui-recaptcha-container" #recaptchaContainer></div>
|
|
1375
|
+
</fieldset>
|
|
1376
|
+
<fui-policies />
|
|
1377
|
+
<fieldset>
|
|
1378
|
+
<fui-form-submit [state]="state()">
|
|
1379
|
+
{{ sendCodeLabel() }}
|
|
1380
|
+
</fui-form-submit>
|
|
1381
|
+
<fui-form-error-message [state]="state()" />
|
|
1382
|
+
</fieldset>
|
|
1383
|
+
</form>
|
|
1384
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }, { kind: "component", type: CountrySelectorComponent, selector: "fui-country-selector", inputs: ["value"], outputs: ["valueChange"] }] });
|
|
1385
|
+
}
|
|
1386
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PhoneNumberFormComponent, decorators: [{
|
|
1387
|
+
type: Component,
|
|
1388
|
+
args: [{
|
|
1389
|
+
selector: "fui-phone-number-form",
|
|
1390
|
+
standalone: true,
|
|
1391
|
+
imports: [
|
|
1392
|
+
CommonModule,
|
|
1393
|
+
TanStackField,
|
|
1394
|
+
TanStackAppField,
|
|
1395
|
+
PoliciesComponent,
|
|
1396
|
+
FormInputComponent,
|
|
1397
|
+
FormSubmitComponent,
|
|
1398
|
+
FormErrorMessageComponent,
|
|
1399
|
+
CountrySelectorComponent,
|
|
1400
|
+
],
|
|
1401
|
+
template: `
|
|
1402
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1403
|
+
<fieldset>
|
|
1404
|
+
<fui-country-selector [(value)]="country"></fui-country-selector>
|
|
1405
|
+
<fui-form-input
|
|
1406
|
+
name="phoneNumber"
|
|
1407
|
+
tanstack-app-field
|
|
1408
|
+
[tanstackField]="form"
|
|
1409
|
+
label="{{ phoneNumberLabel() }}"
|
|
1410
|
+
></fui-form-input>
|
|
1411
|
+
</fieldset>
|
|
1412
|
+
<fieldset>
|
|
1413
|
+
<div class="fui-recaptcha-container" #recaptchaContainer></div>
|
|
1414
|
+
</fieldset>
|
|
1415
|
+
<fui-policies />
|
|
1416
|
+
<fieldset>
|
|
1417
|
+
<fui-form-submit [state]="state()">
|
|
1418
|
+
{{ sendCodeLabel() }}
|
|
1419
|
+
</fui-form-submit>
|
|
1420
|
+
<fui-form-error-message [state]="state()" />
|
|
1421
|
+
</fieldset>
|
|
1422
|
+
</form>
|
|
1423
|
+
`,
|
|
1424
|
+
}]
|
|
1425
|
+
}], ctorParameters: () => [], propDecorators: { onSubmit: [{ type: i0.Output, args: ["onSubmit"] }], recaptchaContainer: [{ type: i0.ViewChild, args: ["recaptchaContainer", { isSignal: true }] }] } });
|
|
1426
|
+
class VerificationFormComponent {
|
|
1427
|
+
ui = injectUI();
|
|
1428
|
+
formSchema = injectPhoneAuthVerifyFormSchema();
|
|
1429
|
+
verificationId = input.required(...(ngDevMode ? [{ debugName: "verificationId" }] : []));
|
|
1430
|
+
signIn = output();
|
|
1431
|
+
verificationCodeLabel = injectTranslation("labels", "verificationCode");
|
|
1432
|
+
verifyCodeLabel = injectTranslation("labels", "verifyCode");
|
|
1433
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
1434
|
+
form = injectForm({
|
|
1435
|
+
defaultValues: {
|
|
1436
|
+
verificationId: "",
|
|
1437
|
+
verificationCode: "",
|
|
1438
|
+
},
|
|
1439
|
+
});
|
|
1440
|
+
state = injectStore(this.form, (state) => state);
|
|
1441
|
+
constructor() {
|
|
1442
|
+
effect(() => {
|
|
1443
|
+
this.form.setFieldValue("verificationId", this.verificationId());
|
|
1444
|
+
});
|
|
1445
|
+
effect(() => {
|
|
1446
|
+
this.form.update({
|
|
1447
|
+
validators: {
|
|
1448
|
+
onBlur: this.formSchema(),
|
|
1449
|
+
onSubmit: this.formSchema(),
|
|
1450
|
+
onSubmitAsync: async ({ value }) => {
|
|
1451
|
+
try {
|
|
1452
|
+
const credential = await confirmPhoneNumber(this.ui(), this.verificationId(), value.verificationCode);
|
|
1453
|
+
this.signIn.emit(credential);
|
|
1454
|
+
return;
|
|
1455
|
+
}
|
|
1456
|
+
catch (error) {
|
|
1457
|
+
if (error instanceof FirebaseUIError) {
|
|
1458
|
+
return error.message;
|
|
1459
|
+
}
|
|
1460
|
+
return this.unknownErrorLabel();
|
|
1461
|
+
}
|
|
1462
|
+
},
|
|
1463
|
+
},
|
|
1464
|
+
});
|
|
1465
|
+
});
|
|
1466
|
+
}
|
|
1467
|
+
async handleSubmit(event) {
|
|
1468
|
+
event.preventDefault();
|
|
1469
|
+
event.stopPropagation();
|
|
1470
|
+
this.form.handleSubmit();
|
|
1471
|
+
}
|
|
1472
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: VerificationFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1473
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: VerificationFormComponent, isStandalone: true, selector: "fui-verification-form", inputs: { verificationId: { classPropertyName: "verificationId", publicName: "verificationId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { signIn: "signIn" }, ngImport: i0, template: `
|
|
1474
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1475
|
+
<fieldset>
|
|
1476
|
+
<fui-form-input
|
|
1477
|
+
name="verificationCode"
|
|
1478
|
+
tanstack-app-field
|
|
1479
|
+
[tanstackField]="form"
|
|
1480
|
+
label="{{ verificationCodeLabel() }}"
|
|
1481
|
+
></fui-form-input>
|
|
1482
|
+
</fieldset>
|
|
1483
|
+
|
|
1484
|
+
<fui-policies />
|
|
1485
|
+
|
|
1486
|
+
<fieldset>
|
|
1487
|
+
<fui-form-submit [state]="state()">
|
|
1488
|
+
{{ verifyCodeLabel() }}
|
|
1489
|
+
</fui-form-submit>
|
|
1490
|
+
<fui-form-error-message [state]="state()" />
|
|
1491
|
+
</fieldset>
|
|
1492
|
+
</form>
|
|
1493
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }] });
|
|
1494
|
+
}
|
|
1495
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: VerificationFormComponent, decorators: [{
|
|
1496
|
+
type: Component,
|
|
1497
|
+
args: [{
|
|
1498
|
+
selector: "fui-verification-form",
|
|
1499
|
+
standalone: true,
|
|
1500
|
+
imports: [
|
|
1501
|
+
CommonModule,
|
|
1502
|
+
TanStackField,
|
|
1503
|
+
TanStackAppField,
|
|
1504
|
+
PoliciesComponent,
|
|
1505
|
+
FormInputComponent,
|
|
1506
|
+
FormSubmitComponent,
|
|
1507
|
+
FormErrorMessageComponent,
|
|
1508
|
+
],
|
|
1509
|
+
template: `
|
|
1510
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1511
|
+
<fieldset>
|
|
1512
|
+
<fui-form-input
|
|
1513
|
+
name="verificationCode"
|
|
1514
|
+
tanstack-app-field
|
|
1515
|
+
[tanstackField]="form"
|
|
1516
|
+
label="{{ verificationCodeLabel() }}"
|
|
1517
|
+
></fui-form-input>
|
|
1518
|
+
</fieldset>
|
|
1519
|
+
|
|
1520
|
+
<fui-policies />
|
|
1521
|
+
|
|
1522
|
+
<fieldset>
|
|
1523
|
+
<fui-form-submit [state]="state()">
|
|
1524
|
+
{{ verifyCodeLabel() }}
|
|
1525
|
+
</fui-form-submit>
|
|
1526
|
+
<fui-form-error-message [state]="state()" />
|
|
1527
|
+
</fieldset>
|
|
1528
|
+
</form>
|
|
1529
|
+
`,
|
|
1530
|
+
}]
|
|
1531
|
+
}], ctorParameters: () => [], propDecorators: { verificationId: [{ type: i0.Input, args: [{ isSignal: true, alias: "verificationId", required: true }] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
1532
|
+
class PhoneAuthFormComponent {
|
|
1533
|
+
verificationId = signal(null, ...(ngDevMode ? [{ debugName: "verificationId" }] : []));
|
|
1534
|
+
signIn = output();
|
|
1535
|
+
handlePhoneSubmit(data) {
|
|
1536
|
+
this.verificationId.set(data.verificationId);
|
|
1537
|
+
}
|
|
1538
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PhoneAuthFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1539
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: PhoneAuthFormComponent, isStandalone: true, selector: "fui-phone-auth-form", outputs: { signIn: "signIn" }, ngImport: i0, template: `
|
|
1540
|
+
<div class="fui-form-container">
|
|
1541
|
+
@if (verificationId()) {
|
|
1542
|
+
<fui-verification-form [verificationId]="verificationId()!" (signIn)="signIn.emit($event)" />
|
|
1543
|
+
} @else {
|
|
1544
|
+
<fui-phone-number-form (onSubmit)="handlePhoneSubmit($event)" />
|
|
1545
|
+
}
|
|
1546
|
+
</div>
|
|
1547
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PhoneNumberFormComponent, selector: "fui-phone-number-form", outputs: ["onSubmit"] }, { kind: "component", type: VerificationFormComponent, selector: "fui-verification-form", inputs: ["verificationId"], outputs: ["signIn"] }] });
|
|
1548
|
+
}
|
|
1549
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PhoneAuthFormComponent, decorators: [{
|
|
1550
|
+
type: Component,
|
|
1551
|
+
args: [{
|
|
1552
|
+
selector: "fui-phone-auth-form",
|
|
1553
|
+
standalone: true,
|
|
1554
|
+
imports: [CommonModule, PhoneNumberFormComponent, VerificationFormComponent],
|
|
1555
|
+
template: `
|
|
1556
|
+
<div class="fui-form-container">
|
|
1557
|
+
@if (verificationId()) {
|
|
1558
|
+
<fui-verification-form [verificationId]="verificationId()!" (signIn)="signIn.emit($event)" />
|
|
1559
|
+
} @else {
|
|
1560
|
+
<fui-phone-number-form (onSubmit)="handlePhoneSubmit($event)" />
|
|
1561
|
+
}
|
|
1562
|
+
</div>
|
|
1563
|
+
`,
|
|
1564
|
+
}]
|
|
1565
|
+
}], propDecorators: { signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
1566
|
+
|
|
1567
|
+
/**
|
|
1568
|
+
* Copyright 2025 Google LLC
|
|
1569
|
+
*
|
|
1570
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1571
|
+
* you may not use this file except in compliance with the License.
|
|
1572
|
+
* You may obtain a copy of the License at
|
|
1573
|
+
*
|
|
1574
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1575
|
+
*
|
|
1576
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1577
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1578
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1579
|
+
* See the License for the specific language governing permissions and
|
|
1580
|
+
* limitations under the License.
|
|
1581
|
+
*/
|
|
1582
|
+
class SignInAuthFormComponent {
|
|
1583
|
+
ui = injectUI();
|
|
1584
|
+
formSchema = injectSignInAuthFormSchema();
|
|
1585
|
+
emailLabel = injectTranslation("labels", "emailAddress");
|
|
1586
|
+
passwordLabel = injectTranslation("labels", "password");
|
|
1587
|
+
forgotPasswordLabel = injectTranslation("labels", "forgotPassword");
|
|
1588
|
+
signInLabel = injectTranslation("labels", "signIn");
|
|
1589
|
+
noAccountLabel = injectTranslation("prompts", "noAccount");
|
|
1590
|
+
signUpLabel = injectTranslation("labels", "signUp");
|
|
1591
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
1592
|
+
forgotPassword = output();
|
|
1593
|
+
signUp = output();
|
|
1594
|
+
signIn = output();
|
|
1595
|
+
form = injectForm({
|
|
1596
|
+
defaultValues: {
|
|
1597
|
+
email: "",
|
|
1598
|
+
password: "",
|
|
1599
|
+
},
|
|
1600
|
+
});
|
|
1601
|
+
state = injectStore(this.form, (state) => state);
|
|
1602
|
+
handleSubmit(event) {
|
|
1603
|
+
event.preventDefault();
|
|
1604
|
+
event.stopPropagation();
|
|
1605
|
+
this.form.handleSubmit();
|
|
1606
|
+
}
|
|
1607
|
+
constructor() {
|
|
1608
|
+
effect(() => {
|
|
1609
|
+
this.form.update({
|
|
1610
|
+
validators: {
|
|
1611
|
+
onChange: this.formSchema(),
|
|
1612
|
+
onBlur: this.formSchema(),
|
|
1613
|
+
onSubmit: this.formSchema(),
|
|
1614
|
+
onSubmitAsync: async ({ value }) => {
|
|
1615
|
+
try {
|
|
1616
|
+
const credential = await signInWithEmailAndPassword(this.ui(), value.email, value.password);
|
|
1617
|
+
this.signIn?.emit(credential);
|
|
1618
|
+
return;
|
|
1619
|
+
}
|
|
1620
|
+
catch (error) {
|
|
1621
|
+
if (error instanceof FirebaseUIError) {
|
|
1622
|
+
return error.message;
|
|
1623
|
+
}
|
|
1624
|
+
return this.unknownErrorLabel();
|
|
1625
|
+
}
|
|
1626
|
+
},
|
|
1627
|
+
},
|
|
1628
|
+
});
|
|
1629
|
+
});
|
|
1630
|
+
}
|
|
1631
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignInAuthFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1632
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: SignInAuthFormComponent, isStandalone: true, selector: "fui-sign-in-auth-form", outputs: { forgotPassword: "forgotPassword", signUp: "signUp", signIn: "signIn" }, ngImport: i0, template: `
|
|
1633
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1634
|
+
<fieldset>
|
|
1635
|
+
<fui-form-input
|
|
1636
|
+
name="email"
|
|
1637
|
+
tanstack-app-field
|
|
1638
|
+
[tanstackField]="form"
|
|
1639
|
+
label="{{ emailLabel() }}"
|
|
1640
|
+
></fui-form-input>
|
|
1641
|
+
</fieldset>
|
|
1642
|
+
<fieldset>
|
|
1643
|
+
<fui-form-input
|
|
1644
|
+
name="password"
|
|
1645
|
+
tanstack-app-field
|
|
1646
|
+
[tanstackField]="form"
|
|
1647
|
+
label="{{ passwordLabel() }}"
|
|
1648
|
+
type="password"
|
|
1649
|
+
>
|
|
1650
|
+
@if (forgotPassword) {
|
|
1651
|
+
<button ngProjectAs="input-action" fui-form-action (click)="forgotPassword.emit()">
|
|
1652
|
+
{{ forgotPasswordLabel() }}
|
|
1653
|
+
</button>
|
|
1654
|
+
}
|
|
1655
|
+
</fui-form-input>
|
|
1656
|
+
</fieldset>
|
|
1657
|
+
|
|
1658
|
+
<fui-policies />
|
|
1659
|
+
|
|
1660
|
+
<fieldset>
|
|
1661
|
+
<fui-form-submit [state]="state()">
|
|
1662
|
+
{{ signInLabel() }}
|
|
1663
|
+
</fui-form-submit>
|
|
1664
|
+
<fui-form-error-message [state]="state()" />
|
|
1665
|
+
</fieldset>
|
|
1666
|
+
|
|
1667
|
+
@if (signUp) {
|
|
1668
|
+
<button fui-form-action (click)="signUp.emit()">{{ noAccountLabel() }} {{ signUpLabel() }}</button>
|
|
1669
|
+
}
|
|
1670
|
+
</form>
|
|
1671
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }, { kind: "component", type: FormActionComponent, selector: "button[fui-form-action]" }] });
|
|
1672
|
+
}
|
|
1673
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignInAuthFormComponent, decorators: [{
|
|
1674
|
+
type: Component,
|
|
1675
|
+
args: [{
|
|
1676
|
+
selector: "fui-sign-in-auth-form",
|
|
1677
|
+
standalone: true,
|
|
1678
|
+
imports: [
|
|
1679
|
+
CommonModule,
|
|
1680
|
+
TanStackField,
|
|
1681
|
+
TanStackAppField,
|
|
1682
|
+
PoliciesComponent,
|
|
1683
|
+
FormInputComponent,
|
|
1684
|
+
FormSubmitComponent,
|
|
1685
|
+
FormErrorMessageComponent,
|
|
1686
|
+
FormActionComponent,
|
|
1687
|
+
],
|
|
1688
|
+
template: `
|
|
1689
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1690
|
+
<fieldset>
|
|
1691
|
+
<fui-form-input
|
|
1692
|
+
name="email"
|
|
1693
|
+
tanstack-app-field
|
|
1694
|
+
[tanstackField]="form"
|
|
1695
|
+
label="{{ emailLabel() }}"
|
|
1696
|
+
></fui-form-input>
|
|
1697
|
+
</fieldset>
|
|
1698
|
+
<fieldset>
|
|
1699
|
+
<fui-form-input
|
|
1700
|
+
name="password"
|
|
1701
|
+
tanstack-app-field
|
|
1702
|
+
[tanstackField]="form"
|
|
1703
|
+
label="{{ passwordLabel() }}"
|
|
1704
|
+
type="password"
|
|
1705
|
+
>
|
|
1706
|
+
@if (forgotPassword) {
|
|
1707
|
+
<button ngProjectAs="input-action" fui-form-action (click)="forgotPassword.emit()">
|
|
1708
|
+
{{ forgotPasswordLabel() }}
|
|
1709
|
+
</button>
|
|
1710
|
+
}
|
|
1711
|
+
</fui-form-input>
|
|
1712
|
+
</fieldset>
|
|
1713
|
+
|
|
1714
|
+
<fui-policies />
|
|
1715
|
+
|
|
1716
|
+
<fieldset>
|
|
1717
|
+
<fui-form-submit [state]="state()">
|
|
1718
|
+
{{ signInLabel() }}
|
|
1719
|
+
</fui-form-submit>
|
|
1720
|
+
<fui-form-error-message [state]="state()" />
|
|
1721
|
+
</fieldset>
|
|
1722
|
+
|
|
1723
|
+
@if (signUp) {
|
|
1724
|
+
<button fui-form-action (click)="signUp.emit()">{{ noAccountLabel() }} {{ signUpLabel() }}</button>
|
|
1725
|
+
}
|
|
1726
|
+
</form>
|
|
1727
|
+
`,
|
|
1728
|
+
}]
|
|
1729
|
+
}], ctorParameters: () => [], propDecorators: { forgotPassword: [{ type: i0.Output, args: ["forgotPassword"] }], signUp: [{ type: i0.Output, args: ["signUp"] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
1730
|
+
|
|
1731
|
+
/**
|
|
1732
|
+
* Copyright 2025 Google LLC
|
|
1733
|
+
*
|
|
1734
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1735
|
+
* you may not use this file except in compliance with the License.
|
|
1736
|
+
* You may obtain a copy of the License at
|
|
1737
|
+
*
|
|
1738
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1739
|
+
*
|
|
1740
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1741
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1742
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1743
|
+
* See the License for the specific language governing permissions and
|
|
1744
|
+
* limitations under the License.
|
|
1745
|
+
*/
|
|
1746
|
+
class SignUpAuthFormComponent {
|
|
1747
|
+
ui = injectUI();
|
|
1748
|
+
formSchema = injectSignUpAuthFormSchema();
|
|
1749
|
+
requireDisplayNameField = computed(() => {
|
|
1750
|
+
return hasBehavior(this.ui(), "requireDisplayName");
|
|
1751
|
+
}, ...(ngDevMode ? [{ debugName: "requireDisplayNameField" }] : []));
|
|
1752
|
+
emailLabel = injectTranslation("labels", "emailAddress");
|
|
1753
|
+
displayNameLabel = injectTranslation("labels", "displayName");
|
|
1754
|
+
passwordLabel = injectTranslation("labels", "password");
|
|
1755
|
+
createAccountLabel = injectTranslation("labels", "createAccount");
|
|
1756
|
+
haveAccountLabel = injectTranslation("prompts", "haveAccount");
|
|
1757
|
+
signInLabel = injectTranslation("labels", "signIn");
|
|
1758
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
1759
|
+
signUp = output();
|
|
1760
|
+
signIn = output();
|
|
1761
|
+
form = injectForm({
|
|
1762
|
+
defaultValues: {
|
|
1763
|
+
email: "",
|
|
1764
|
+
password: "",
|
|
1765
|
+
displayName: this.requireDisplayNameField() ? "" : undefined,
|
|
1766
|
+
},
|
|
1767
|
+
});
|
|
1768
|
+
state = injectStore(this.form, (state) => state);
|
|
1769
|
+
handleSubmit(event) {
|
|
1770
|
+
event.preventDefault();
|
|
1771
|
+
event.stopPropagation();
|
|
1772
|
+
this.form.handleSubmit();
|
|
1773
|
+
}
|
|
1774
|
+
constructor() {
|
|
1775
|
+
effect(() => {
|
|
1776
|
+
this.form.update({
|
|
1777
|
+
validators: {
|
|
1778
|
+
onBlur: this.formSchema(),
|
|
1779
|
+
onSubmit: this.formSchema(),
|
|
1780
|
+
onSubmitAsync: async ({ value }) => {
|
|
1781
|
+
try {
|
|
1782
|
+
const credential = await createUserWithEmailAndPassword(this.ui(), value.email, value.password, value.displayName);
|
|
1783
|
+
this.signUp?.emit(credential);
|
|
1784
|
+
return;
|
|
1785
|
+
}
|
|
1786
|
+
catch (error) {
|
|
1787
|
+
if (error instanceof FirebaseUIError) {
|
|
1788
|
+
return error.message;
|
|
1789
|
+
}
|
|
1790
|
+
return this.unknownErrorLabel();
|
|
1791
|
+
}
|
|
1792
|
+
},
|
|
1793
|
+
},
|
|
1794
|
+
});
|
|
1795
|
+
});
|
|
1796
|
+
}
|
|
1797
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignUpAuthFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1798
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: SignUpAuthFormComponent, isStandalone: true, selector: "fui-sign-up-auth-form", outputs: { signUp: "signUp", signIn: "signIn" }, ngImport: i0, template: `
|
|
1799
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1800
|
+
@if (requireDisplayNameField()) {
|
|
1801
|
+
<fieldset>
|
|
1802
|
+
<fui-form-input
|
|
1803
|
+
name="displayName"
|
|
1804
|
+
tanstack-app-field
|
|
1805
|
+
[tanstackField]="form"
|
|
1806
|
+
label="{{ displayNameLabel() }}"
|
|
1807
|
+
/>
|
|
1808
|
+
</fieldset>
|
|
1809
|
+
}
|
|
1810
|
+
<fieldset>
|
|
1811
|
+
<fui-form-input name="email" tanstack-app-field [tanstackField]="form" label="{{ emailLabel() }}" />
|
|
1812
|
+
</fieldset>
|
|
1813
|
+
<fieldset>
|
|
1814
|
+
<fui-form-input
|
|
1815
|
+
name="password"
|
|
1816
|
+
tanstack-app-field
|
|
1817
|
+
[tanstackField]="form"
|
|
1818
|
+
label="{{ passwordLabel() }}"
|
|
1819
|
+
type="password"
|
|
1820
|
+
/>
|
|
1821
|
+
</fieldset>
|
|
1822
|
+
<fui-policies />
|
|
1823
|
+
<fieldset>
|
|
1824
|
+
<fui-form-submit [state]="state()">
|
|
1825
|
+
{{ createAccountLabel() }}
|
|
1826
|
+
</fui-form-submit>
|
|
1827
|
+
<fui-form-error-message [state]="state()" />
|
|
1828
|
+
</fieldset>
|
|
1829
|
+
|
|
1830
|
+
@if (signIn) {
|
|
1831
|
+
<button fui-form-action (click)="signIn.emit()">{{ haveAccountLabel() }} {{ signInLabel() }} →</button>
|
|
1832
|
+
}
|
|
1833
|
+
</form>
|
|
1834
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TanStackField, selector: "[tanstackField]", inputs: ["name", "defaultValue", "asyncDebounceMs", "asyncAlways", "tanstackField", "validators", "listeners", "defaultMeta", "mode", "disableErrorFlat"], exportAs: ["field"] }, { kind: "directive", type: TanStackAppField, selector: "[tanstack-app-field]" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: FormInputComponent, selector: "fui-form-input", inputs: ["label", "type"] }, { kind: "component", type: FormSubmitComponent, selector: "fui-form-submit", inputs: ["class", "state"] }, { kind: "component", type: FormErrorMessageComponent, selector: "fui-form-error-message", inputs: ["state"] }, { kind: "component", type: FormActionComponent, selector: "button[fui-form-action]" }] });
|
|
1835
|
+
}
|
|
1836
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignUpAuthFormComponent, decorators: [{
|
|
1837
|
+
type: Component,
|
|
1838
|
+
args: [{
|
|
1839
|
+
selector: "fui-sign-up-auth-form",
|
|
1840
|
+
imports: [
|
|
1841
|
+
CommonModule,
|
|
1842
|
+
TanStackField,
|
|
1843
|
+
TanStackAppField,
|
|
1844
|
+
PoliciesComponent,
|
|
1845
|
+
FormInputComponent,
|
|
1846
|
+
FormSubmitComponent,
|
|
1847
|
+
FormErrorMessageComponent,
|
|
1848
|
+
FormActionComponent,
|
|
1849
|
+
],
|
|
1850
|
+
template: `
|
|
1851
|
+
<form (submit)="handleSubmit($event)" class="fui-form">
|
|
1852
|
+
@if (requireDisplayNameField()) {
|
|
1853
|
+
<fieldset>
|
|
1854
|
+
<fui-form-input
|
|
1855
|
+
name="displayName"
|
|
1856
|
+
tanstack-app-field
|
|
1857
|
+
[tanstackField]="form"
|
|
1858
|
+
label="{{ displayNameLabel() }}"
|
|
1859
|
+
/>
|
|
1860
|
+
</fieldset>
|
|
1861
|
+
}
|
|
1862
|
+
<fieldset>
|
|
1863
|
+
<fui-form-input name="email" tanstack-app-field [tanstackField]="form" label="{{ emailLabel() }}" />
|
|
1864
|
+
</fieldset>
|
|
1865
|
+
<fieldset>
|
|
1866
|
+
<fui-form-input
|
|
1867
|
+
name="password"
|
|
1868
|
+
tanstack-app-field
|
|
1869
|
+
[tanstackField]="form"
|
|
1870
|
+
label="{{ passwordLabel() }}"
|
|
1871
|
+
type="password"
|
|
1872
|
+
/>
|
|
1873
|
+
</fieldset>
|
|
1874
|
+
<fui-policies />
|
|
1875
|
+
<fieldset>
|
|
1876
|
+
<fui-form-submit [state]="state()">
|
|
1877
|
+
{{ createAccountLabel() }}
|
|
1878
|
+
</fui-form-submit>
|
|
1879
|
+
<fui-form-error-message [state]="state()" />
|
|
1880
|
+
</fieldset>
|
|
1881
|
+
|
|
1882
|
+
@if (signIn) {
|
|
1883
|
+
<button fui-form-action (click)="signIn.emit()">{{ haveAccountLabel() }} {{ signInLabel() }} →</button>
|
|
1884
|
+
}
|
|
1885
|
+
</form>
|
|
1886
|
+
`,
|
|
1887
|
+
standalone: true,
|
|
1888
|
+
}]
|
|
1889
|
+
}], ctorParameters: () => [], propDecorators: { signUp: [{ type: i0.Output, args: ["signUp"] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
1890
|
+
|
|
1891
|
+
/**
|
|
1892
|
+
* Copyright 2025 Google LLC
|
|
1893
|
+
*
|
|
1894
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1895
|
+
* you may not use this file except in compliance with the License.
|
|
1896
|
+
* You may obtain a copy of the License at
|
|
1897
|
+
*
|
|
1898
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1899
|
+
*
|
|
1900
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1901
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1902
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1903
|
+
* See the License for the specific language governing permissions and
|
|
1904
|
+
* limitations under the License.
|
|
1905
|
+
*/
|
|
1906
|
+
class OAuthButtonComponent {
|
|
1907
|
+
ui = injectUI();
|
|
1908
|
+
unknownErrorLabel = injectTranslation("errors", "unknownError");
|
|
1909
|
+
provider = input.required(...(ngDevMode ? [{ debugName: "provider" }] : []));
|
|
1910
|
+
error = signal(undefined, ...(ngDevMode ? [{ debugName: "error" }] : []));
|
|
1911
|
+
async handleOAuthSignIn() {
|
|
1912
|
+
this.error.set(undefined);
|
|
1913
|
+
try {
|
|
1914
|
+
await signInWithProvider(this.ui(), this.provider());
|
|
1915
|
+
}
|
|
1916
|
+
catch (error) {
|
|
1917
|
+
if (error instanceof FirebaseUIError) {
|
|
1918
|
+
this.error.set(error.message);
|
|
1919
|
+
return;
|
|
1920
|
+
}
|
|
1921
|
+
console.error(error);
|
|
1922
|
+
this.error.set(this.unknownErrorLabel());
|
|
1923
|
+
}
|
|
1924
|
+
}
|
|
1925
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: OAuthButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1926
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: OAuthButtonComponent, isStandalone: true, selector: "fui-oauth-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
1927
|
+
<div>
|
|
1928
|
+
<button
|
|
1929
|
+
fui-button
|
|
1930
|
+
type="button"
|
|
1931
|
+
(click)="handleOAuthSignIn()"
|
|
1932
|
+
[disabled]="ui().state !== 'idle'"
|
|
1933
|
+
[attr.data-provider]="provider().providerId"
|
|
1934
|
+
class="fui-provider__button"
|
|
1935
|
+
>
|
|
1936
|
+
<ng-content></ng-content>
|
|
1937
|
+
</button>
|
|
1938
|
+
|
|
1939
|
+
@if (error()) {
|
|
1940
|
+
<div class="fui-form__error">{{ error() }}</div>
|
|
1941
|
+
}
|
|
1942
|
+
</div>
|
|
1943
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ButtonComponent, selector: "button[fui-button]", inputs: ["variant"] }] });
|
|
1944
|
+
}
|
|
1945
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: OAuthButtonComponent, decorators: [{
|
|
1946
|
+
type: Component,
|
|
1947
|
+
args: [{
|
|
1948
|
+
selector: "fui-oauth-button",
|
|
1949
|
+
standalone: true,
|
|
1950
|
+
imports: [CommonModule, ButtonComponent],
|
|
1951
|
+
template: `
|
|
1952
|
+
<div>
|
|
1953
|
+
<button
|
|
1954
|
+
fui-button
|
|
1955
|
+
type="button"
|
|
1956
|
+
(click)="handleOAuthSignIn()"
|
|
1957
|
+
[disabled]="ui().state !== 'idle'"
|
|
1958
|
+
[attr.data-provider]="provider().providerId"
|
|
1959
|
+
class="fui-provider__button"
|
|
1960
|
+
>
|
|
1961
|
+
<ng-content></ng-content>
|
|
1962
|
+
</button>
|
|
1963
|
+
|
|
1964
|
+
@if (error()) {
|
|
1965
|
+
<div class="fui-form__error">{{ error() }}</div>
|
|
1966
|
+
}
|
|
1967
|
+
</div>
|
|
1968
|
+
`,
|
|
1969
|
+
}]
|
|
1970
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: true }] }] } });
|
|
1971
|
+
|
|
1972
|
+
/**
|
|
1973
|
+
* Copyright 2025 Google LLC
|
|
1974
|
+
*
|
|
1975
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1976
|
+
* you may not use this file except in compliance with the License.
|
|
1977
|
+
* You may obtain a copy of the License at
|
|
1978
|
+
*
|
|
1979
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1980
|
+
*
|
|
1981
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1982
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1983
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1984
|
+
* See the License for the specific language governing permissions and
|
|
1985
|
+
* limitations under the License.
|
|
1986
|
+
*/
|
|
1987
|
+
// GENERATED BY generate-logos.ts
|
|
1988
|
+
class GoogleLogoComponent {
|
|
1989
|
+
width = input("1em", ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
1990
|
+
height = input("1em", ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
1991
|
+
className = input("", ...(ngDevMode ? [{ debugName: "className" }] : []));
|
|
1992
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GoogleLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1993
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: GoogleLogoComponent, isStandalone: true, selector: "fui-google-logo", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
1994
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="fui-provider__icon">
|
|
1995
|
+
<path
|
|
1996
|
+
fill="#FFC107"
|
|
1997
|
+
d="M43.611,20.083H42V20H24v8h11.303c-1.649,4.657-6.08,8-11.303,8c-6.627,0-12-5.373-12-12c0-6.627,5.373-12,12-12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C12.955,4,4,12.955,4,24c0,11.045,8.955,20,20,20c11.045,0,20-8.955,20-20C44,22.659,43.862,21.35,43.611,20.083z"
|
|
1998
|
+
/>
|
|
1999
|
+
<path
|
|
2000
|
+
fill="#FF3D00"
|
|
2001
|
+
d="M6.306,14.691l6.571,4.819C14.655,15.108,18.961,12,24,12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C16.318,4,9.656,8.337,6.306,14.691z"
|
|
2002
|
+
/>
|
|
2003
|
+
<path
|
|
2004
|
+
fill="#4CAF50"
|
|
2005
|
+
d="M24,44c5.166,0,9.86-1.977,13.409-5.192l-6.19-5.238C29.211,35.091,26.715,36,24,36c-5.202,0-9.619-3.317-11.283-7.946l-6.522,5.025C9.505,39.556,16.227,44,24,44z"
|
|
2006
|
+
/>
|
|
2007
|
+
<path
|
|
2008
|
+
fill="#1976D2"
|
|
2009
|
+
d="M43.611,20.083H42V20H24v8h11.303c-0.792,2.237-2.231,4.166-4.087,5.571c0.001-0.001,0.002-0.001,0.003-0.002l6.19,5.238C36.971,39.205,44,34,44,24C44,22.659,43.862,21.35,43.611,20.083z"
|
|
2010
|
+
/>
|
|
2011
|
+
</svg>
|
|
2012
|
+
`, isInline: true });
|
|
2013
|
+
}
|
|
2014
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GoogleLogoComponent, decorators: [{
|
|
2015
|
+
type: Component,
|
|
2016
|
+
args: [{
|
|
2017
|
+
selector: "fui-google-logo",
|
|
2018
|
+
standalone: true,
|
|
2019
|
+
template: `
|
|
2020
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="fui-provider__icon">
|
|
2021
|
+
<path
|
|
2022
|
+
fill="#FFC107"
|
|
2023
|
+
d="M43.611,20.083H42V20H24v8h11.303c-1.649,4.657-6.08,8-11.303,8c-6.627,0-12-5.373-12-12c0-6.627,5.373-12,12-12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C12.955,4,4,12.955,4,24c0,11.045,8.955,20,20,20c11.045,0,20-8.955,20-20C44,22.659,43.862,21.35,43.611,20.083z"
|
|
2024
|
+
/>
|
|
2025
|
+
<path
|
|
2026
|
+
fill="#FF3D00"
|
|
2027
|
+
d="M6.306,14.691l6.571,4.819C14.655,15.108,18.961,12,24,12c3.059,0,5.842,1.154,7.961,3.039l5.657-5.657C34.046,6.053,29.268,4,24,4C16.318,4,9.656,8.337,6.306,14.691z"
|
|
2028
|
+
/>
|
|
2029
|
+
<path
|
|
2030
|
+
fill="#4CAF50"
|
|
2031
|
+
d="M24,44c5.166,0,9.86-1.977,13.409-5.192l-6.19-5.238C29.211,35.091,26.715,36,24,36c-5.202,0-9.619-3.317-11.283-7.946l-6.522,5.025C9.505,39.556,16.227,44,24,44z"
|
|
2032
|
+
/>
|
|
2033
|
+
<path
|
|
2034
|
+
fill="#1976D2"
|
|
2035
|
+
d="M43.611,20.083H42V20H24v8h11.303c-0.792,2.237-2.231,4.166-4.087,5.571c0.001-0.001,0.002-0.001,0.003-0.002l6.19,5.238C36.971,39.205,44,34,44,24C44,22.659,43.862,21.35,43.611,20.083z"
|
|
2036
|
+
/>
|
|
2037
|
+
</svg>
|
|
2038
|
+
`,
|
|
2039
|
+
}]
|
|
2040
|
+
}], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
|
|
2041
|
+
|
|
2042
|
+
/**
|
|
2043
|
+
* Copyright 2025 Google LLC
|
|
2044
|
+
*
|
|
2045
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2046
|
+
* you may not use this file except in compliance with the License.
|
|
2047
|
+
* You may obtain a copy of the License at
|
|
2048
|
+
*
|
|
2049
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2050
|
+
*
|
|
2051
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2052
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2053
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2054
|
+
* See the License for the specific language governing permissions and
|
|
2055
|
+
* limitations under the License.
|
|
2056
|
+
*/
|
|
2057
|
+
class GoogleSignInButtonComponent {
|
|
2058
|
+
ui = injectUI();
|
|
2059
|
+
signInWithGoogleLabel = injectTranslation("labels", "signInWithGoogle");
|
|
2060
|
+
defaultProvider = new GoogleAuthProvider();
|
|
2061
|
+
provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : []));
|
|
2062
|
+
get googleProvider() {
|
|
2063
|
+
return this.provider() || this.defaultProvider;
|
|
2064
|
+
}
|
|
2065
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GoogleSignInButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2066
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: GoogleSignInButtonComponent, isStandalone: true, selector: "fui-google-sign-in-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2067
|
+
<fui-oauth-button [provider]="googleProvider">
|
|
2068
|
+
<fui-google-logo />
|
|
2069
|
+
<span>{{ signInWithGoogleLabel() }}</span>
|
|
2070
|
+
</fui-oauth-button>
|
|
2071
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OAuthButtonComponent, selector: "fui-oauth-button", inputs: ["provider"] }, { kind: "component", type: GoogleLogoComponent, selector: "fui-google-logo", inputs: ["width", "height", "className"] }] });
|
|
2072
|
+
}
|
|
2073
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GoogleSignInButtonComponent, decorators: [{
|
|
2074
|
+
type: Component,
|
|
2075
|
+
args: [{
|
|
2076
|
+
selector: "fui-google-sign-in-button",
|
|
2077
|
+
standalone: true,
|
|
2078
|
+
imports: [CommonModule, OAuthButtonComponent, GoogleLogoComponent],
|
|
2079
|
+
template: `
|
|
2080
|
+
<fui-oauth-button [provider]="googleProvider">
|
|
2081
|
+
<fui-google-logo />
|
|
2082
|
+
<span>{{ signInWithGoogleLabel() }}</span>
|
|
2083
|
+
</fui-oauth-button>
|
|
2084
|
+
`,
|
|
2085
|
+
}]
|
|
2086
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }] } });
|
|
2087
|
+
|
|
2088
|
+
/**
|
|
2089
|
+
* Copyright 2025 Google LLC
|
|
2090
|
+
*
|
|
2091
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2092
|
+
* you may not use this file except in compliance with the License.
|
|
2093
|
+
* You may obtain a copy of the License at
|
|
2094
|
+
*
|
|
2095
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2096
|
+
*
|
|
2097
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2098
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2099
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2100
|
+
* See the License for the specific language governing permissions and
|
|
2101
|
+
* limitations under the License.
|
|
2102
|
+
*/
|
|
2103
|
+
// GENERATED BY generate-logos.ts
|
|
2104
|
+
class FacebookLogoComponent {
|
|
2105
|
+
width = input("1em", ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
2106
|
+
height = input("1em", ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
2107
|
+
className = input("", ...(ngDevMode ? [{ debugName: "className" }] : []));
|
|
2108
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FacebookLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2109
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: FacebookLogoComponent, isStandalone: true, selector: "fui-facebook-logo", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2110
|
+
<?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="fui-provider__icon">
|
|
2111
|
+
<path
|
|
2112
|
+
fill="currentColor"
|
|
2113
|
+
d="M25,3C12.85,3,3,12.85,3,25c0,11.03,8.125,20.137,18.712,21.728V30.831h-5.443v-5.783h5.443v-3.848 c0-6.371,3.104-9.168,8.399-9.168c2.536,0,3.877,0.188,4.512,0.274v5.048h-3.612c-2.248,0-3.033,2.131-3.033,4.533v3.161h6.588 l-0.894,5.783h-5.694v15.944C38.716,45.318,47,36.137,47,25C47,12.85,37.15,3,25,3z"
|
|
2114
|
+
/>
|
|
2115
|
+
</svg>
|
|
2116
|
+
`, isInline: true });
|
|
2117
|
+
}
|
|
2118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FacebookLogoComponent, decorators: [{
|
|
2119
|
+
type: Component,
|
|
2120
|
+
args: [{
|
|
2121
|
+
selector: "fui-facebook-logo",
|
|
2122
|
+
standalone: true,
|
|
2123
|
+
template: `
|
|
2124
|
+
<?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="fui-provider__icon">
|
|
2125
|
+
<path
|
|
2126
|
+
fill="currentColor"
|
|
2127
|
+
d="M25,3C12.85,3,3,12.85,3,25c0,11.03,8.125,20.137,18.712,21.728V30.831h-5.443v-5.783h5.443v-3.848 c0-6.371,3.104-9.168,8.399-9.168c2.536,0,3.877,0.188,4.512,0.274v5.048h-3.612c-2.248,0-3.033,2.131-3.033,4.533v3.161h6.588 l-0.894,5.783h-5.694v15.944C38.716,45.318,47,36.137,47,25C47,12.85,37.15,3,25,3z"
|
|
2128
|
+
/>
|
|
2129
|
+
</svg>
|
|
2130
|
+
`,
|
|
2131
|
+
}]
|
|
2132
|
+
}], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
|
|
2133
|
+
|
|
2134
|
+
/**
|
|
2135
|
+
* Copyright 2025 Google LLC
|
|
2136
|
+
*
|
|
2137
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2138
|
+
* you may not use this file except in compliance with the License.
|
|
2139
|
+
* You may obtain a copy of the License at
|
|
2140
|
+
*
|
|
2141
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2142
|
+
*
|
|
2143
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2144
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2145
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2146
|
+
* See the License for the specific language governing permissions and
|
|
2147
|
+
* limitations under the License.
|
|
2148
|
+
*/
|
|
2149
|
+
class FacebookSignInButtonComponent {
|
|
2150
|
+
ui = injectUI();
|
|
2151
|
+
signInWithFacebookLabel = injectTranslation("labels", "signInWithFacebook");
|
|
2152
|
+
defaultProvider = new FacebookAuthProvider();
|
|
2153
|
+
provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : []));
|
|
2154
|
+
get facebookProvider() {
|
|
2155
|
+
return this.provider() || this.defaultProvider;
|
|
2156
|
+
}
|
|
2157
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FacebookSignInButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2158
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: FacebookSignInButtonComponent, isStandalone: true, selector: "fui-facebook-sign-in-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2159
|
+
<fui-oauth-button [provider]="facebookProvider">
|
|
2160
|
+
<fui-facebook-logo />
|
|
2161
|
+
<span>{{ signInWithFacebookLabel() }}</span>
|
|
2162
|
+
</fui-oauth-button>
|
|
2163
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OAuthButtonComponent, selector: "fui-oauth-button", inputs: ["provider"] }, { kind: "component", type: FacebookLogoComponent, selector: "fui-facebook-logo", inputs: ["width", "height", "className"] }] });
|
|
2164
|
+
}
|
|
2165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: FacebookSignInButtonComponent, decorators: [{
|
|
2166
|
+
type: Component,
|
|
2167
|
+
args: [{
|
|
2168
|
+
selector: "fui-facebook-sign-in-button",
|
|
2169
|
+
standalone: true,
|
|
2170
|
+
imports: [CommonModule, OAuthButtonComponent, FacebookLogoComponent],
|
|
2171
|
+
template: `
|
|
2172
|
+
<fui-oauth-button [provider]="facebookProvider">
|
|
2173
|
+
<fui-facebook-logo />
|
|
2174
|
+
<span>{{ signInWithFacebookLabel() }}</span>
|
|
2175
|
+
</fui-oauth-button>
|
|
2176
|
+
`,
|
|
2177
|
+
}]
|
|
2178
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }] } });
|
|
2179
|
+
|
|
2180
|
+
/**
|
|
2181
|
+
* Copyright 2025 Google LLC
|
|
2182
|
+
*
|
|
2183
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2184
|
+
* you may not use this file except in compliance with the License.
|
|
2185
|
+
* You may obtain a copy of the License at
|
|
2186
|
+
*
|
|
2187
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2188
|
+
*
|
|
2189
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2190
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2191
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2192
|
+
* See the License for the specific language governing permissions and
|
|
2193
|
+
* limitations under the License.
|
|
2194
|
+
*/
|
|
2195
|
+
// GENERATED BY generate-logos.ts
|
|
2196
|
+
class AppleLogoComponent {
|
|
2197
|
+
width = input("1em", ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
2198
|
+
height = input("1em", ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
2199
|
+
className = input("", ...(ngDevMode ? [{ debugName: "className" }] : []));
|
|
2200
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AppleLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2201
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: AppleLogoComponent, isStandalone: true, selector: "fui-apple-logo", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2202
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="fui-provider__icon">
|
|
2203
|
+
<path
|
|
2204
|
+
fill="currentColor"
|
|
2205
|
+
d="M 44.527344 34.75 C 43.449219 37.144531 42.929688 38.214844 41.542969 40.328125 C 39.601563 43.28125 36.863281 46.96875 33.480469 46.992188 C 30.46875 47.019531 29.691406 45.027344 25.601563 45.0625 C 21.515625 45.082031 20.664063 47.03125 17.648438 47 C 14.261719 46.96875 11.671875 43.648438 9.730469 40.699219 C 4.300781 32.429688 3.726563 22.734375 7.082031 17.578125 C 9.457031 13.921875 13.210938 11.773438 16.738281 11.773438 C 20.332031 11.773438 22.589844 13.746094 25.558594 13.746094 C 28.441406 13.746094 30.195313 11.769531 34.351563 11.769531 C 37.492188 11.769531 40.8125 13.480469 43.1875 16.433594 C 35.421875 20.691406 36.683594 31.78125 44.527344 34.75 Z M 31.195313 8.46875 C 32.707031 6.527344 33.855469 3.789063 33.4375 1 C 30.972656 1.167969 28.089844 2.742188 26.40625 4.78125 C 24.878906 6.640625 23.613281 9.398438 24.105469 12.066406 C 26.796875 12.152344 29.582031 10.546875 31.195313 8.46875 Z"
|
|
2206
|
+
/>
|
|
2207
|
+
</svg>
|
|
2208
|
+
`, isInline: true });
|
|
2209
|
+
}
|
|
2210
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AppleLogoComponent, decorators: [{
|
|
2211
|
+
type: Component,
|
|
2212
|
+
args: [{
|
|
2213
|
+
selector: "fui-apple-logo",
|
|
2214
|
+
standalone: true,
|
|
2215
|
+
template: `
|
|
2216
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" class="fui-provider__icon">
|
|
2217
|
+
<path
|
|
2218
|
+
fill="currentColor"
|
|
2219
|
+
d="M 44.527344 34.75 C 43.449219 37.144531 42.929688 38.214844 41.542969 40.328125 C 39.601563 43.28125 36.863281 46.96875 33.480469 46.992188 C 30.46875 47.019531 29.691406 45.027344 25.601563 45.0625 C 21.515625 45.082031 20.664063 47.03125 17.648438 47 C 14.261719 46.96875 11.671875 43.648438 9.730469 40.699219 C 4.300781 32.429688 3.726563 22.734375 7.082031 17.578125 C 9.457031 13.921875 13.210938 11.773438 16.738281 11.773438 C 20.332031 11.773438 22.589844 13.746094 25.558594 13.746094 C 28.441406 13.746094 30.195313 11.769531 34.351563 11.769531 C 37.492188 11.769531 40.8125 13.480469 43.1875 16.433594 C 35.421875 20.691406 36.683594 31.78125 44.527344 34.75 Z M 31.195313 8.46875 C 32.707031 6.527344 33.855469 3.789063 33.4375 1 C 30.972656 1.167969 28.089844 2.742188 26.40625 4.78125 C 24.878906 6.640625 23.613281 9.398438 24.105469 12.066406 C 26.796875 12.152344 29.582031 10.546875 31.195313 8.46875 Z"
|
|
2220
|
+
/>
|
|
2221
|
+
</svg>
|
|
2222
|
+
`,
|
|
2223
|
+
}]
|
|
2224
|
+
}], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
|
|
2225
|
+
|
|
2226
|
+
/**
|
|
2227
|
+
* Copyright 2025 Google LLC
|
|
2228
|
+
*
|
|
2229
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2230
|
+
* you may not use this file except in compliance with the License.
|
|
2231
|
+
* You may obtain a copy of the License at
|
|
2232
|
+
*
|
|
2233
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2234
|
+
*
|
|
2235
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2236
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2237
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2238
|
+
* See the License for the specific language governing permissions and
|
|
2239
|
+
* limitations under the License.
|
|
2240
|
+
*/
|
|
2241
|
+
class AppleSignInButtonComponent {
|
|
2242
|
+
ui = injectUI();
|
|
2243
|
+
signInWithAppleLabel = injectTranslation("labels", "signInWithApple");
|
|
2244
|
+
defaultProvider = new OAuthProvider("apple.com");
|
|
2245
|
+
provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : []));
|
|
2246
|
+
get appleProvider() {
|
|
2247
|
+
return this.provider() || this.defaultProvider;
|
|
2248
|
+
}
|
|
2249
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AppleSignInButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2250
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: AppleSignInButtonComponent, isStandalone: true, selector: "fui-apple-sign-in-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2251
|
+
<fui-oauth-button [provider]="appleProvider">
|
|
2252
|
+
<fui-apple-logo />
|
|
2253
|
+
<span>{{ signInWithAppleLabel() }}</span>
|
|
2254
|
+
</fui-oauth-button>
|
|
2255
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OAuthButtonComponent, selector: "fui-oauth-button", inputs: ["provider"] }, { kind: "component", type: AppleLogoComponent, selector: "fui-apple-logo", inputs: ["width", "height", "className"] }] });
|
|
2256
|
+
}
|
|
2257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: AppleSignInButtonComponent, decorators: [{
|
|
2258
|
+
type: Component,
|
|
2259
|
+
args: [{
|
|
2260
|
+
selector: "fui-apple-sign-in-button",
|
|
2261
|
+
standalone: true,
|
|
2262
|
+
imports: [CommonModule, OAuthButtonComponent, AppleLogoComponent],
|
|
2263
|
+
template: `
|
|
2264
|
+
<fui-oauth-button [provider]="appleProvider">
|
|
2265
|
+
<fui-apple-logo />
|
|
2266
|
+
<span>{{ signInWithAppleLabel() }}</span>
|
|
2267
|
+
</fui-oauth-button>
|
|
2268
|
+
`,
|
|
2269
|
+
}]
|
|
2270
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }] } });
|
|
2271
|
+
|
|
2272
|
+
/**
|
|
2273
|
+
* Copyright 2025 Google LLC
|
|
2274
|
+
*
|
|
2275
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2276
|
+
* you may not use this file except in compliance with the License.
|
|
2277
|
+
* You may obtain a copy of the License at
|
|
2278
|
+
*
|
|
2279
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2280
|
+
*
|
|
2281
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2282
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2283
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2284
|
+
* See the License for the specific language governing permissions and
|
|
2285
|
+
* limitations under the License.
|
|
2286
|
+
*/
|
|
2287
|
+
// GENERATED BY generate-logos.ts
|
|
2288
|
+
class MicrosoftLogoComponent {
|
|
2289
|
+
width = input("1em", ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
2290
|
+
height = input("1em", ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
2291
|
+
className = input("", ...(ngDevMode ? [{ debugName: "className" }] : []));
|
|
2292
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: MicrosoftLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2293
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: MicrosoftLogoComponent, isStandalone: true, selector: "fui-microsoft-logo", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2294
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="fui-provider__icon">
|
|
2295
|
+
<path fill="#ff5722" d="M6 6H22V22H6z" transform="rotate(-180 14 14)" />
|
|
2296
|
+
<path fill="#4caf50" d="M26 6H42V22H26z" transform="rotate(-180 34 14)" />
|
|
2297
|
+
<path fill="#ffc107" d="M26 26H42V42H26z" transform="rotate(-180 34 34)" />
|
|
2298
|
+
<path fill="#03a9f4" d="M6 26H22V42H6z" transform="rotate(-180 14 34)" />
|
|
2299
|
+
</svg>
|
|
2300
|
+
`, isInline: true });
|
|
2301
|
+
}
|
|
2302
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: MicrosoftLogoComponent, decorators: [{
|
|
2303
|
+
type: Component,
|
|
2304
|
+
args: [{
|
|
2305
|
+
selector: "fui-microsoft-logo",
|
|
2306
|
+
standalone: true,
|
|
2307
|
+
template: `
|
|
2308
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="fui-provider__icon">
|
|
2309
|
+
<path fill="#ff5722" d="M6 6H22V22H6z" transform="rotate(-180 14 14)" />
|
|
2310
|
+
<path fill="#4caf50" d="M26 6H42V22H26z" transform="rotate(-180 34 14)" />
|
|
2311
|
+
<path fill="#ffc107" d="M26 26H42V42H26z" transform="rotate(-180 34 34)" />
|
|
2312
|
+
<path fill="#03a9f4" d="M6 26H22V42H6z" transform="rotate(-180 14 34)" />
|
|
2313
|
+
</svg>
|
|
2314
|
+
`,
|
|
2315
|
+
}]
|
|
2316
|
+
}], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
|
|
2317
|
+
|
|
2318
|
+
/**
|
|
2319
|
+
* Copyright 2025 Google LLC
|
|
2320
|
+
*
|
|
2321
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2322
|
+
* you may not use this file except in compliance with the License.
|
|
2323
|
+
* You may obtain a copy of the License at
|
|
2324
|
+
*
|
|
2325
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2326
|
+
*
|
|
2327
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2328
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2329
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2330
|
+
* See the License for the specific language governing permissions and
|
|
2331
|
+
* limitations under the License.
|
|
2332
|
+
*/
|
|
2333
|
+
class MicrosoftSignInButtonComponent {
|
|
2334
|
+
signInWithMicrosoftLabel = injectTranslation("labels", "signInWithMicrosoft");
|
|
2335
|
+
defaultProvider = new OAuthProvider("microsoft.com");
|
|
2336
|
+
provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : []));
|
|
2337
|
+
get microsoftProvider() {
|
|
2338
|
+
return this.provider() || this.defaultProvider;
|
|
2339
|
+
}
|
|
2340
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: MicrosoftSignInButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2341
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: MicrosoftSignInButtonComponent, isStandalone: true, selector: "fui-microsoft-sign-in-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2342
|
+
<fui-oauth-button [provider]="microsoftProvider">
|
|
2343
|
+
<fui-microsoft-logo />
|
|
2344
|
+
<span>{{ signInWithMicrosoftLabel() }}</span>
|
|
2345
|
+
</fui-oauth-button>
|
|
2346
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OAuthButtonComponent, selector: "fui-oauth-button", inputs: ["provider"] }, { kind: "component", type: MicrosoftLogoComponent, selector: "fui-microsoft-logo", inputs: ["width", "height", "className"] }] });
|
|
2347
|
+
}
|
|
2348
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: MicrosoftSignInButtonComponent, decorators: [{
|
|
2349
|
+
type: Component,
|
|
2350
|
+
args: [{
|
|
2351
|
+
selector: "fui-microsoft-sign-in-button",
|
|
2352
|
+
standalone: true,
|
|
2353
|
+
imports: [CommonModule, OAuthButtonComponent, MicrosoftLogoComponent],
|
|
2354
|
+
template: `
|
|
2355
|
+
<fui-oauth-button [provider]="microsoftProvider">
|
|
2356
|
+
<fui-microsoft-logo />
|
|
2357
|
+
<span>{{ signInWithMicrosoftLabel() }}</span>
|
|
2358
|
+
</fui-oauth-button>
|
|
2359
|
+
`,
|
|
2360
|
+
}]
|
|
2361
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }] } });
|
|
2362
|
+
|
|
2363
|
+
/**
|
|
2364
|
+
* Copyright 2025 Google LLC
|
|
2365
|
+
*
|
|
2366
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2367
|
+
* you may not use this file except in compliance with the License.
|
|
2368
|
+
* You may obtain a copy of the License at
|
|
2369
|
+
*
|
|
2370
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2371
|
+
*
|
|
2372
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2373
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2374
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2375
|
+
* See the License for the specific language governing permissions and
|
|
2376
|
+
* limitations under the License.
|
|
2377
|
+
*/
|
|
2378
|
+
// GENERATED BY generate-logos.ts
|
|
2379
|
+
class TwitterLogoComponent {
|
|
2380
|
+
width = input("1em", ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
2381
|
+
height = input("1em", ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
2382
|
+
className = input("", ...(ngDevMode ? [{ debugName: "className" }] : []));
|
|
2383
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: TwitterLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2384
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: TwitterLogoComponent, isStandalone: true, selector: "fui-twitter-logo", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2385
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="currentColor" class="fui-provider__icon">
|
|
2386
|
+
<path
|
|
2387
|
+
d="M26.37,26l-8.795-12.822l0.015,0.012L25.52,4h-2.65l-6.46,7.48L11.28,4H4.33l8.211,11.971L12.54,15.97L3.88,26h2.65 l7.182-8.322L19.42,26H26.37z M10.23,6l12.34,18h-2.1L8.12,6H10.23z"
|
|
2388
|
+
/>
|
|
2389
|
+
</svg>
|
|
2390
|
+
`, isInline: true });
|
|
2391
|
+
}
|
|
2392
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: TwitterLogoComponent, decorators: [{
|
|
2393
|
+
type: Component,
|
|
2394
|
+
args: [{
|
|
2395
|
+
selector: "fui-twitter-logo",
|
|
2396
|
+
standalone: true,
|
|
2397
|
+
template: `
|
|
2398
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="currentColor" class="fui-provider__icon">
|
|
2399
|
+
<path
|
|
2400
|
+
d="M26.37,26l-8.795-12.822l0.015,0.012L25.52,4h-2.65l-6.46,7.48L11.28,4H4.33l8.211,11.971L12.54,15.97L3.88,26h2.65 l7.182-8.322L19.42,26H26.37z M10.23,6l12.34,18h-2.1L8.12,6H10.23z"
|
|
2401
|
+
/>
|
|
2402
|
+
</svg>
|
|
2403
|
+
`,
|
|
2404
|
+
}]
|
|
2405
|
+
}], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
|
|
2406
|
+
|
|
2407
|
+
/**
|
|
2408
|
+
* Copyright 2025 Google LLC
|
|
2409
|
+
*
|
|
2410
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2411
|
+
* you may not use this file except in compliance with the License.
|
|
2412
|
+
* You may obtain a copy of the License at
|
|
2413
|
+
*
|
|
2414
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2415
|
+
*
|
|
2416
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2417
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2418
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2419
|
+
* See the License for the specific language governing permissions and
|
|
2420
|
+
* limitations under the License.
|
|
2421
|
+
*/
|
|
2422
|
+
class TwitterSignInButtonComponent {
|
|
2423
|
+
signInWithTwitterLabel = injectTranslation("labels", "signInWithTwitter");
|
|
2424
|
+
defaultProvider = new TwitterAuthProvider();
|
|
2425
|
+
provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : []));
|
|
2426
|
+
get twitterProvider() {
|
|
2427
|
+
return this.provider() || this.defaultProvider;
|
|
2428
|
+
}
|
|
2429
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: TwitterSignInButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2430
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: TwitterSignInButtonComponent, isStandalone: true, selector: "fui-twitter-sign-in-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2431
|
+
<fui-oauth-button [provider]="twitterProvider">
|
|
2432
|
+
<fui-twitter-logo />
|
|
2433
|
+
<span>{{ signInWithTwitterLabel() }}</span>
|
|
2434
|
+
</fui-oauth-button>
|
|
2435
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OAuthButtonComponent, selector: "fui-oauth-button", inputs: ["provider"] }, { kind: "component", type: TwitterLogoComponent, selector: "fui-twitter-logo", inputs: ["width", "height", "className"] }] });
|
|
2436
|
+
}
|
|
2437
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: TwitterSignInButtonComponent, decorators: [{
|
|
2438
|
+
type: Component,
|
|
2439
|
+
args: [{
|
|
2440
|
+
selector: "fui-twitter-sign-in-button",
|
|
2441
|
+
standalone: true,
|
|
2442
|
+
imports: [CommonModule, OAuthButtonComponent, TwitterLogoComponent],
|
|
2443
|
+
template: `
|
|
2444
|
+
<fui-oauth-button [provider]="twitterProvider">
|
|
2445
|
+
<fui-twitter-logo />
|
|
2446
|
+
<span>{{ signInWithTwitterLabel() }}</span>
|
|
2447
|
+
</fui-oauth-button>
|
|
2448
|
+
`,
|
|
2449
|
+
}]
|
|
2450
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }] } });
|
|
2451
|
+
|
|
2452
|
+
/**
|
|
2453
|
+
* Copyright 2025 Google LLC
|
|
2454
|
+
*
|
|
2455
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2456
|
+
* you may not use this file except in compliance with the License.
|
|
2457
|
+
* You may obtain a copy of the License at
|
|
2458
|
+
*
|
|
2459
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2460
|
+
*
|
|
2461
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2462
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2463
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2464
|
+
* See the License for the specific language governing permissions and
|
|
2465
|
+
* limitations under the License.
|
|
2466
|
+
*/
|
|
2467
|
+
// GENERATED BY generate-logos.ts
|
|
2468
|
+
class GithubLogoComponent {
|
|
2469
|
+
width = input("1em", ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
2470
|
+
height = input("1em", ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
2471
|
+
className = input("", ...(ngDevMode ? [{ debugName: "className" }] : []));
|
|
2472
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GithubLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2473
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: GithubLogoComponent, isStandalone: true, selector: "fui-github-logo", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2474
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="currentColor" class="fui-provider__icon">
|
|
2475
|
+
<path
|
|
2476
|
+
d="M15,3C8.373,3,3,8.373,3,15c0,5.623,3.872,10.328,9.092,11.63C12.036,26.468,12,26.28,12,26.047v-2.051 c-0.487,0-1.303,0-1.508,0c-0.821,0-1.551-0.353-1.905-1.009c-0.393-0.729-0.461-1.844-1.435-2.526 c-0.289-0.227-0.069-0.486,0.264-0.451c0.615,0.174,1.125,0.596,1.605,1.222c0.478,0.627,0.703,0.769,1.596,0.769 c0.433,0,1.081-0.025,1.691-0.121c0.328-0.833,0.895-1.6,1.588-1.962c-3.996-0.411-5.903-2.399-5.903-5.098 c0-1.162,0.495-2.286,1.336-3.233C9.053,10.647,8.706,8.73,9.435,8c1.798,0,2.885,1.166,3.146,1.481C13.477,9.174,14.461,9,15.495,9 c1.036,0,2.024,0.174,2.922,0.483C18.675,9.17,19.763,8,21.565,8c0.732,0.731,0.381,2.656,0.102,3.594 c0.836,0.945,1.328,2.066,1.328,3.226c0,2.697-1.904,4.684-5.894,5.097C18.199,20.49,19,22.1,19,23.313v2.734 c0,0.104-0.023,0.179-0.035,0.268C23.641,24.676,27,20.236,27,15C27,8.373,21.627,3,15,3z"
|
|
2477
|
+
/>
|
|
2478
|
+
</svg>
|
|
2479
|
+
`, isInline: true });
|
|
2480
|
+
}
|
|
2481
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GithubLogoComponent, decorators: [{
|
|
2482
|
+
type: Component,
|
|
2483
|
+
args: [{
|
|
2484
|
+
selector: "fui-github-logo",
|
|
2485
|
+
standalone: true,
|
|
2486
|
+
template: `
|
|
2487
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="currentColor" class="fui-provider__icon">
|
|
2488
|
+
<path
|
|
2489
|
+
d="M15,3C8.373,3,3,8.373,3,15c0,5.623,3.872,10.328,9.092,11.63C12.036,26.468,12,26.28,12,26.047v-2.051 c-0.487,0-1.303,0-1.508,0c-0.821,0-1.551-0.353-1.905-1.009c-0.393-0.729-0.461-1.844-1.435-2.526 c-0.289-0.227-0.069-0.486,0.264-0.451c0.615,0.174,1.125,0.596,1.605,1.222c0.478,0.627,0.703,0.769,1.596,0.769 c0.433,0,1.081-0.025,1.691-0.121c0.328-0.833,0.895-1.6,1.588-1.962c-3.996-0.411-5.903-2.399-5.903-5.098 c0-1.162,0.495-2.286,1.336-3.233C9.053,10.647,8.706,8.73,9.435,8c1.798,0,2.885,1.166,3.146,1.481C13.477,9.174,14.461,9,15.495,9 c1.036,0,2.024,0.174,2.922,0.483C18.675,9.17,19.763,8,21.565,8c0.732,0.731,0.381,2.656,0.102,3.594 c0.836,0.945,1.328,2.066,1.328,3.226c0,2.697-1.904,4.684-5.894,5.097C18.199,20.49,19,22.1,19,23.313v2.734 c0,0.104-0.023,0.179-0.035,0.268C23.641,24.676,27,20.236,27,15C27,8.373,21.627,3,15,3z"
|
|
2490
|
+
/>
|
|
2491
|
+
</svg>
|
|
2492
|
+
`,
|
|
2493
|
+
}]
|
|
2494
|
+
}], propDecorators: { width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }] } });
|
|
2495
|
+
|
|
2496
|
+
/**
|
|
2497
|
+
* Copyright 2025 Google LLC
|
|
2498
|
+
*
|
|
2499
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2500
|
+
* you may not use this file except in compliance with the License.
|
|
2501
|
+
* You may obtain a copy of the License at
|
|
2502
|
+
*
|
|
2503
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2504
|
+
*
|
|
2505
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2506
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2507
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2508
|
+
* See the License for the specific language governing permissions and
|
|
2509
|
+
* limitations under the License.
|
|
2510
|
+
*/
|
|
2511
|
+
class GithubSignInButtonComponent {
|
|
2512
|
+
signInWithGithubLabel = injectTranslation("labels", "signInWithGithub");
|
|
2513
|
+
defaultProvider = new GithubAuthProvider();
|
|
2514
|
+
provider = input(...(ngDevMode ? [undefined, { debugName: "provider" }] : []));
|
|
2515
|
+
get githubProvider() {
|
|
2516
|
+
return this.provider() || this.defaultProvider;
|
|
2517
|
+
}
|
|
2518
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GithubSignInButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2519
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.7", type: GithubSignInButtonComponent, isStandalone: true, selector: "fui-github-sign-in-button", inputs: { provider: { classPropertyName: "provider", publicName: "provider", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2520
|
+
<fui-oauth-button [provider]="githubProvider">
|
|
2521
|
+
<fui-github-logo />
|
|
2522
|
+
<span>{{ signInWithGithubLabel() }}</span>
|
|
2523
|
+
</fui-oauth-button>
|
|
2524
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: OAuthButtonComponent, selector: "fui-oauth-button", inputs: ["provider"] }, { kind: "component", type: GithubLogoComponent, selector: "fui-github-logo", inputs: ["width", "height", "className"] }] });
|
|
2525
|
+
}
|
|
2526
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: GithubSignInButtonComponent, decorators: [{
|
|
2527
|
+
type: Component,
|
|
2528
|
+
args: [{
|
|
2529
|
+
selector: "fui-github-sign-in-button",
|
|
2530
|
+
standalone: true,
|
|
2531
|
+
imports: [CommonModule, OAuthButtonComponent, GithubLogoComponent],
|
|
2532
|
+
template: `
|
|
2533
|
+
<fui-oauth-button [provider]="githubProvider">
|
|
2534
|
+
<fui-github-logo />
|
|
2535
|
+
<span>{{ signInWithGithubLabel() }}</span>
|
|
2536
|
+
</fui-oauth-button>
|
|
2537
|
+
`,
|
|
2538
|
+
}]
|
|
2539
|
+
}], propDecorators: { provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }] } });
|
|
2540
|
+
|
|
2541
|
+
/**
|
|
2542
|
+
* Copyright 2025 Google LLC
|
|
2543
|
+
*
|
|
2544
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2545
|
+
* you may not use this file except in compliance with the License.
|
|
2546
|
+
* You may obtain a copy of the License at
|
|
2547
|
+
*
|
|
2548
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2549
|
+
*
|
|
2550
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2551
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2552
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2553
|
+
* See the License for the specific language governing permissions and
|
|
2554
|
+
* limitations under the License.
|
|
2555
|
+
*/
|
|
2556
|
+
class CardComponent {
|
|
2557
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2558
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: CardComponent, isStandalone: true, selector: "fui-card", ngImport: i0, template: `
|
|
2559
|
+
<div class="fui-card">
|
|
2560
|
+
<ng-content select="fui-card-header"></ng-content>
|
|
2561
|
+
<ng-content select="fui-card-content"></ng-content>
|
|
2562
|
+
</div>
|
|
2563
|
+
`, isInline: true });
|
|
2564
|
+
}
|
|
2565
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardComponent, decorators: [{
|
|
2566
|
+
type: Component,
|
|
2567
|
+
args: [{
|
|
2568
|
+
selector: "fui-card",
|
|
2569
|
+
standalone: true,
|
|
2570
|
+
imports: [],
|
|
2571
|
+
template: `
|
|
2572
|
+
<div class="fui-card">
|
|
2573
|
+
<ng-content select="fui-card-header"></ng-content>
|
|
2574
|
+
<ng-content select="fui-card-content"></ng-content>
|
|
2575
|
+
</div>
|
|
2576
|
+
`,
|
|
2577
|
+
}]
|
|
2578
|
+
}] });
|
|
2579
|
+
class CardHeaderComponent {
|
|
2580
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2581
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: CardHeaderComponent, isStandalone: true, selector: "fui-card-header", ngImport: i0, template: `
|
|
2582
|
+
<div class="fui-card__header">
|
|
2583
|
+
<ng-content select="fui-card-title"></ng-content>
|
|
2584
|
+
<ng-content select="fui-card-subtitle"></ng-content>
|
|
2585
|
+
</div>
|
|
2586
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
2587
|
+
}
|
|
2588
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardHeaderComponent, decorators: [{
|
|
2589
|
+
type: Component,
|
|
2590
|
+
args: [{
|
|
2591
|
+
selector: "fui-card-header",
|
|
2592
|
+
standalone: true,
|
|
2593
|
+
imports: [CommonModule],
|
|
2594
|
+
template: `
|
|
2595
|
+
<div class="fui-card__header">
|
|
2596
|
+
<ng-content select="fui-card-title"></ng-content>
|
|
2597
|
+
<ng-content select="fui-card-subtitle"></ng-content>
|
|
2598
|
+
</div>
|
|
2599
|
+
`,
|
|
2600
|
+
}]
|
|
2601
|
+
}] });
|
|
2602
|
+
class CardTitleComponent {
|
|
2603
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2604
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: CardTitleComponent, isStandalone: true, selector: "fui-card-title", ngImport: i0, template: `
|
|
2605
|
+
<h2 class="fui-card__title">
|
|
2606
|
+
<ng-content></ng-content>
|
|
2607
|
+
</h2>
|
|
2608
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
2609
|
+
}
|
|
2610
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardTitleComponent, decorators: [{
|
|
2611
|
+
type: Component,
|
|
2612
|
+
args: [{
|
|
2613
|
+
selector: "fui-card-title",
|
|
2614
|
+
standalone: true,
|
|
2615
|
+
imports: [CommonModule],
|
|
2616
|
+
template: `
|
|
2617
|
+
<h2 class="fui-card__title">
|
|
2618
|
+
<ng-content></ng-content>
|
|
2619
|
+
</h2>
|
|
2620
|
+
`,
|
|
2621
|
+
}]
|
|
2622
|
+
}] });
|
|
2623
|
+
class CardSubtitleComponent {
|
|
2624
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardSubtitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2625
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: CardSubtitleComponent, isStandalone: true, selector: "fui-card-subtitle", ngImport: i0, template: `
|
|
2626
|
+
<p class="fui-card__subtitle">
|
|
2627
|
+
<ng-content></ng-content>
|
|
2628
|
+
</p>
|
|
2629
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
2630
|
+
}
|
|
2631
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardSubtitleComponent, decorators: [{
|
|
2632
|
+
type: Component,
|
|
2633
|
+
args: [{
|
|
2634
|
+
selector: "fui-card-subtitle",
|
|
2635
|
+
standalone: true,
|
|
2636
|
+
imports: [CommonModule],
|
|
2637
|
+
template: `
|
|
2638
|
+
<p class="fui-card__subtitle">
|
|
2639
|
+
<ng-content></ng-content>
|
|
2640
|
+
</p>
|
|
2641
|
+
`,
|
|
2642
|
+
}]
|
|
2643
|
+
}] });
|
|
2644
|
+
class CardContentComponent {
|
|
2645
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2646
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: CardContentComponent, isStandalone: true, selector: "fui-card-content", ngImport: i0, template: `
|
|
2647
|
+
<div class="fui-card__content">
|
|
2648
|
+
<ng-content></ng-content>
|
|
2649
|
+
</div>
|
|
2650
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
2651
|
+
}
|
|
2652
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: CardContentComponent, decorators: [{
|
|
2653
|
+
type: Component,
|
|
2654
|
+
args: [{
|
|
2655
|
+
selector: "fui-card-content",
|
|
2656
|
+
standalone: true,
|
|
2657
|
+
imports: [CommonModule],
|
|
2658
|
+
template: `
|
|
2659
|
+
<div class="fui-card__content">
|
|
2660
|
+
<ng-content></ng-content>
|
|
2661
|
+
</div>
|
|
2662
|
+
`,
|
|
2663
|
+
}]
|
|
2664
|
+
}] });
|
|
2665
|
+
|
|
2666
|
+
/**
|
|
2667
|
+
* Copyright 2025 Google LLC
|
|
2668
|
+
*
|
|
2669
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2670
|
+
* you may not use this file except in compliance with the License.
|
|
2671
|
+
* You may obtain a copy of the License at
|
|
2672
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2673
|
+
*
|
|
2674
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2675
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2676
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2677
|
+
* See the License for the specific language governing permissions and
|
|
2678
|
+
* limitations under the License.
|
|
2679
|
+
*/
|
|
2680
|
+
class RedirectErrorComponent {
|
|
2681
|
+
error = injectRedirectError();
|
|
2682
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: RedirectErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2683
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: RedirectErrorComponent, isStandalone: true, selector: "fui-redirect-error", ngImport: i0, template: `
|
|
2684
|
+
@if (error()) {
|
|
2685
|
+
<div class="fui-form__error">{{ error() }}</div>
|
|
2686
|
+
}
|
|
2687
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
2688
|
+
}
|
|
2689
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: RedirectErrorComponent, decorators: [{
|
|
2690
|
+
type: Component,
|
|
2691
|
+
args: [{
|
|
2692
|
+
selector: "fui-redirect-error",
|
|
2693
|
+
standalone: true,
|
|
2694
|
+
imports: [CommonModule],
|
|
2695
|
+
template: `
|
|
2696
|
+
@if (error()) {
|
|
2697
|
+
<div class="fui-form__error">{{ error() }}</div>
|
|
2698
|
+
}
|
|
2699
|
+
`,
|
|
2700
|
+
}]
|
|
2701
|
+
}] });
|
|
2702
|
+
|
|
2703
|
+
/**
|
|
2704
|
+
* Copyright 2025 Google LLC
|
|
2705
|
+
*
|
|
2706
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2707
|
+
* you may not use this file except in compliance with the License.
|
|
2708
|
+
* You may obtain a copy of the License at
|
|
2709
|
+
*
|
|
2710
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2711
|
+
*
|
|
2712
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2713
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2714
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2715
|
+
* See the License for the specific language governing permissions and
|
|
2716
|
+
* limitations under the License.
|
|
2717
|
+
*/
|
|
2718
|
+
class EmailLinkAuthScreenComponent {
|
|
2719
|
+
titleText = injectTranslation("labels", "signIn");
|
|
2720
|
+
subtitleText = injectTranslation("prompts", "signInToAccount");
|
|
2721
|
+
emailSent = output();
|
|
2722
|
+
signIn = output();
|
|
2723
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: EmailLinkAuthScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2724
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: EmailLinkAuthScreenComponent, isStandalone: true, selector: "fui-email-link-auth-screen", outputs: { emailSent: "emailSent", signIn: "signIn" }, ngImport: i0, template: `
|
|
2725
|
+
<div class="fui-screen">
|
|
2726
|
+
<fui-card>
|
|
2727
|
+
<fui-card-header>
|
|
2728
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
2729
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
2730
|
+
</fui-card-header>
|
|
2731
|
+
<fui-card-content>
|
|
2732
|
+
<fui-email-link-auth-form (emailSent)="emailSent.emit()" (signIn)="signIn.emit($event)" />
|
|
2733
|
+
<fui-redirect-error />
|
|
2734
|
+
<ng-content></ng-content>
|
|
2735
|
+
</fui-card-content>
|
|
2736
|
+
</fui-card>
|
|
2737
|
+
</div>
|
|
2738
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CardComponent, selector: "fui-card" }, { kind: "component", type: CardHeaderComponent, selector: "fui-card-header" }, { kind: "component", type: CardTitleComponent, selector: "fui-card-title" }, { kind: "component", type: CardSubtitleComponent, selector: "fui-card-subtitle" }, { kind: "component", type: CardContentComponent, selector: "fui-card-content" }, { kind: "component", type: EmailLinkAuthFormComponent, selector: "fui-email-link-auth-form", outputs: ["emailSent", "signIn"] }, { kind: "component", type: RedirectErrorComponent, selector: "fui-redirect-error" }] });
|
|
2739
|
+
}
|
|
2740
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: EmailLinkAuthScreenComponent, decorators: [{
|
|
2741
|
+
type: Component,
|
|
2742
|
+
args: [{
|
|
2743
|
+
selector: "fui-email-link-auth-screen",
|
|
2744
|
+
standalone: true,
|
|
2745
|
+
imports: [
|
|
2746
|
+
CommonModule,
|
|
2747
|
+
CardComponent,
|
|
2748
|
+
CardHeaderComponent,
|
|
2749
|
+
CardTitleComponent,
|
|
2750
|
+
CardSubtitleComponent,
|
|
2751
|
+
CardContentComponent,
|
|
2752
|
+
EmailLinkAuthFormComponent,
|
|
2753
|
+
RedirectErrorComponent,
|
|
2754
|
+
],
|
|
2755
|
+
template: `
|
|
2756
|
+
<div class="fui-screen">
|
|
2757
|
+
<fui-card>
|
|
2758
|
+
<fui-card-header>
|
|
2759
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
2760
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
2761
|
+
</fui-card-header>
|
|
2762
|
+
<fui-card-content>
|
|
2763
|
+
<fui-email-link-auth-form (emailSent)="emailSent.emit()" (signIn)="signIn.emit($event)" />
|
|
2764
|
+
<fui-redirect-error />
|
|
2765
|
+
<ng-content></ng-content>
|
|
2766
|
+
</fui-card-content>
|
|
2767
|
+
</fui-card>
|
|
2768
|
+
</div>
|
|
2769
|
+
`,
|
|
2770
|
+
}]
|
|
2771
|
+
}], propDecorators: { emailSent: [{ type: i0.Output, args: ["emailSent"] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
2772
|
+
|
|
2773
|
+
/**
|
|
2774
|
+
* Copyright 2025 Google LLC
|
|
2775
|
+
*
|
|
2776
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2777
|
+
* you may not use this file except in compliance with the License.
|
|
2778
|
+
* You may obtain a copy of the License at
|
|
2779
|
+
*
|
|
2780
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2781
|
+
*
|
|
2782
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2783
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2784
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2785
|
+
* See the License for the specific language governing permissions and
|
|
2786
|
+
* limitations under the License.
|
|
2787
|
+
*/
|
|
2788
|
+
class ForgotPasswordAuthScreenComponent {
|
|
2789
|
+
titleText = injectTranslation("labels", "resetPassword");
|
|
2790
|
+
subtitleText = injectTranslation("prompts", "enterEmailToReset");
|
|
2791
|
+
passwordSent = output();
|
|
2792
|
+
backToSignIn = output();
|
|
2793
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ForgotPasswordAuthScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2794
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: ForgotPasswordAuthScreenComponent, isStandalone: true, selector: "fui-forgot-password-auth-screen", outputs: { passwordSent: "passwordSent", backToSignIn: "backToSignIn" }, ngImport: i0, template: `
|
|
2795
|
+
<div class="fui-screen">
|
|
2796
|
+
<fui-card>
|
|
2797
|
+
<fui-card-header>
|
|
2798
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
2799
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
2800
|
+
</fui-card-header>
|
|
2801
|
+
<fui-card-content>
|
|
2802
|
+
<fui-forgot-password-auth-form (passwordSent)="passwordSent.emit()" (backToSignIn)="backToSignIn.emit()" />
|
|
2803
|
+
<fui-redirect-error />
|
|
2804
|
+
</fui-card-content>
|
|
2805
|
+
</fui-card>
|
|
2806
|
+
</div>
|
|
2807
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CardComponent, selector: "fui-card" }, { kind: "component", type: CardHeaderComponent, selector: "fui-card-header" }, { kind: "component", type: CardTitleComponent, selector: "fui-card-title" }, { kind: "component", type: CardSubtitleComponent, selector: "fui-card-subtitle" }, { kind: "component", type: CardContentComponent, selector: "fui-card-content" }, { kind: "component", type: ForgotPasswordAuthFormComponent, selector: "fui-forgot-password-auth-form", outputs: ["passwordSent", "backToSignIn"] }, { kind: "component", type: RedirectErrorComponent, selector: "fui-redirect-error" }] });
|
|
2808
|
+
}
|
|
2809
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ForgotPasswordAuthScreenComponent, decorators: [{
|
|
2810
|
+
type: Component,
|
|
2811
|
+
args: [{
|
|
2812
|
+
selector: "fui-forgot-password-auth-screen",
|
|
2813
|
+
standalone: true,
|
|
2814
|
+
imports: [
|
|
2815
|
+
CommonModule,
|
|
2816
|
+
CardComponent,
|
|
2817
|
+
CardHeaderComponent,
|
|
2818
|
+
CardTitleComponent,
|
|
2819
|
+
CardSubtitleComponent,
|
|
2820
|
+
CardContentComponent,
|
|
2821
|
+
ForgotPasswordAuthFormComponent,
|
|
2822
|
+
RedirectErrorComponent,
|
|
2823
|
+
],
|
|
2824
|
+
template: `
|
|
2825
|
+
<div class="fui-screen">
|
|
2826
|
+
<fui-card>
|
|
2827
|
+
<fui-card-header>
|
|
2828
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
2829
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
2830
|
+
</fui-card-header>
|
|
2831
|
+
<fui-card-content>
|
|
2832
|
+
<fui-forgot-password-auth-form (passwordSent)="passwordSent.emit()" (backToSignIn)="backToSignIn.emit()" />
|
|
2833
|
+
<fui-redirect-error />
|
|
2834
|
+
</fui-card-content>
|
|
2835
|
+
</fui-card>
|
|
2836
|
+
</div>
|
|
2837
|
+
`,
|
|
2838
|
+
}]
|
|
2839
|
+
}], propDecorators: { passwordSent: [{ type: i0.Output, args: ["passwordSent"] }], backToSignIn: [{ type: i0.Output, args: ["backToSignIn"] }] } });
|
|
2840
|
+
|
|
2841
|
+
/**
|
|
2842
|
+
* Copyright 2025 Google LLC
|
|
2843
|
+
*
|
|
2844
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2845
|
+
* you may not use this file except in compliance with the License.
|
|
2846
|
+
* You may obtain a copy of the License at
|
|
2847
|
+
*
|
|
2848
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2849
|
+
*
|
|
2850
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2851
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2852
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2853
|
+
* See the License for the specific language governing permissions and
|
|
2854
|
+
* limitations under the License.
|
|
2855
|
+
*/
|
|
2856
|
+
class DividerComponent {
|
|
2857
|
+
label = input(...(ngDevMode ? [undefined, { debugName: "label" }] : []));
|
|
2858
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: DividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2859
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: DividerComponent, isStandalone: true, selector: "fui-divider", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
2860
|
+
<div class="fui-divider my-6">
|
|
2861
|
+
<div class="fui-divider__line"></div>
|
|
2862
|
+
@if (label()) {
|
|
2863
|
+
<div class="fui-divider__text">{{ label() }}</div>
|
|
2864
|
+
<div class="fui-divider__line"></div>
|
|
2865
|
+
}
|
|
2866
|
+
</div>
|
|
2867
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
2868
|
+
}
|
|
2869
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: DividerComponent, decorators: [{
|
|
2870
|
+
type: Component,
|
|
2871
|
+
args: [{
|
|
2872
|
+
selector: "fui-divider",
|
|
2873
|
+
standalone: true,
|
|
2874
|
+
imports: [CommonModule],
|
|
2875
|
+
template: `
|
|
2876
|
+
<div class="fui-divider my-6">
|
|
2877
|
+
<div class="fui-divider__line"></div>
|
|
2878
|
+
@if (label()) {
|
|
2879
|
+
<div class="fui-divider__text">{{ label() }}</div>
|
|
2880
|
+
<div class="fui-divider__line"></div>
|
|
2881
|
+
}
|
|
2882
|
+
</div>
|
|
2883
|
+
`,
|
|
2884
|
+
}]
|
|
2885
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
|
|
2886
|
+
|
|
2887
|
+
/**
|
|
2888
|
+
* Copyright 2025 Google LLC
|
|
2889
|
+
*
|
|
2890
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2891
|
+
* you may not use this file except in compliance with the License.
|
|
2892
|
+
* You may obtain a copy of the License at
|
|
2893
|
+
*
|
|
2894
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2895
|
+
*
|
|
2896
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2897
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2898
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2899
|
+
* See the License for the specific language governing permissions and
|
|
2900
|
+
* limitations under the License.
|
|
2901
|
+
*/
|
|
2902
|
+
class ContentComponent {
|
|
2903
|
+
dividerOrLabel = injectTranslation("messages", "dividerOr");
|
|
2904
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2905
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.7", type: ContentComponent, isStandalone: true, selector: "fui-content", ngImport: i0, template: `
|
|
2906
|
+
<fui-divider [label]="dividerOrLabel()" />
|
|
2907
|
+
<div class="fui-screen__children">
|
|
2908
|
+
<ng-content></ng-content>
|
|
2909
|
+
</div>
|
|
2910
|
+
`, isInline: true, dependencies: [{ kind: "component", type: DividerComponent, selector: "fui-divider", inputs: ["label"] }] });
|
|
2911
|
+
}
|
|
2912
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: ContentComponent, decorators: [{
|
|
2913
|
+
type: Component,
|
|
2914
|
+
args: [{
|
|
2915
|
+
selector: "fui-content",
|
|
2916
|
+
standalone: true,
|
|
2917
|
+
imports: [DividerComponent],
|
|
2918
|
+
template: `
|
|
2919
|
+
<fui-divider [label]="dividerOrLabel()" />
|
|
2920
|
+
<div class="fui-screen__children">
|
|
2921
|
+
<ng-content></ng-content>
|
|
2922
|
+
</div>
|
|
2923
|
+
`,
|
|
2924
|
+
}]
|
|
2925
|
+
}] });
|
|
2926
|
+
|
|
2927
|
+
/**
|
|
2928
|
+
* Copyright 2025 Google LLC
|
|
2929
|
+
*
|
|
2930
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
2931
|
+
* you may not use this file except in compliance with the License.
|
|
2932
|
+
* You may obtain a copy of the License at
|
|
2933
|
+
*
|
|
2934
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
2935
|
+
*
|
|
2936
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
2937
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
2938
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
2939
|
+
* See the License for the specific language governing permissions and
|
|
2940
|
+
* limitations under the License.
|
|
2941
|
+
*/
|
|
2942
|
+
class OAuthScreenComponent {
|
|
2943
|
+
ui = injectUI();
|
|
2944
|
+
mfaResolver = computed(() => this.ui().multiFactorResolver, ...(ngDevMode ? [{ debugName: "mfaResolver" }] : []));
|
|
2945
|
+
titleText = injectTranslation("labels", "signIn");
|
|
2946
|
+
subtitleText = injectTranslation("prompts", "signInToAccount");
|
|
2947
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: OAuthScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2948
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: OAuthScreenComponent, isStandalone: true, selector: "fui-oauth-screen", ngImport: i0, template: `
|
|
2949
|
+
<div class="fui-screen">
|
|
2950
|
+
<fui-card>
|
|
2951
|
+
<fui-card-header>
|
|
2952
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
2953
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
2954
|
+
</fui-card-header>
|
|
2955
|
+
<fui-card-content>
|
|
2956
|
+
@if (mfaResolver()) {
|
|
2957
|
+
<fui-multi-factor-auth-assertion-form />
|
|
2958
|
+
} @else {
|
|
2959
|
+
<fui-content>
|
|
2960
|
+
<ng-content></ng-content>
|
|
2961
|
+
</fui-content>
|
|
2962
|
+
<fui-redirect-error />
|
|
2963
|
+
<fui-policies />
|
|
2964
|
+
}
|
|
2965
|
+
</fui-card-content>
|
|
2966
|
+
</fui-card>
|
|
2967
|
+
</div>
|
|
2968
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CardComponent, selector: "fui-card" }, { kind: "component", type: CardHeaderComponent, selector: "fui-card-header" }, { kind: "component", type: CardTitleComponent, selector: "fui-card-title" }, { kind: "component", type: CardSubtitleComponent, selector: "fui-card-subtitle" }, { kind: "component", type: CardContentComponent, selector: "fui-card-content" }, { kind: "component", type: PoliciesComponent, selector: "fui-policies" }, { kind: "component", type: ContentComponent, selector: "fui-content" }, { kind: "component", type: MultiFactorAuthAssertionFormComponent, selector: "fui-multi-factor-auth-assertion-form" }, { kind: "component", type: RedirectErrorComponent, selector: "fui-redirect-error" }] });
|
|
2969
|
+
}
|
|
2970
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: OAuthScreenComponent, decorators: [{
|
|
2971
|
+
type: Component,
|
|
2972
|
+
args: [{
|
|
2973
|
+
selector: "fui-oauth-screen",
|
|
2974
|
+
standalone: true,
|
|
2975
|
+
imports: [
|
|
2976
|
+
CommonModule,
|
|
2977
|
+
CardComponent,
|
|
2978
|
+
CardHeaderComponent,
|
|
2979
|
+
CardTitleComponent,
|
|
2980
|
+
CardSubtitleComponent,
|
|
2981
|
+
CardContentComponent,
|
|
2982
|
+
PoliciesComponent,
|
|
2983
|
+
ContentComponent,
|
|
2984
|
+
MultiFactorAuthAssertionFormComponent,
|
|
2985
|
+
RedirectErrorComponent,
|
|
2986
|
+
],
|
|
2987
|
+
template: `
|
|
2988
|
+
<div class="fui-screen">
|
|
2989
|
+
<fui-card>
|
|
2990
|
+
<fui-card-header>
|
|
2991
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
2992
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
2993
|
+
</fui-card-header>
|
|
2994
|
+
<fui-card-content>
|
|
2995
|
+
@if (mfaResolver()) {
|
|
2996
|
+
<fui-multi-factor-auth-assertion-form />
|
|
2997
|
+
} @else {
|
|
2998
|
+
<fui-content>
|
|
2999
|
+
<ng-content></ng-content>
|
|
3000
|
+
</fui-content>
|
|
3001
|
+
<fui-redirect-error />
|
|
3002
|
+
<fui-policies />
|
|
3003
|
+
}
|
|
3004
|
+
</fui-card-content>
|
|
3005
|
+
</fui-card>
|
|
3006
|
+
</div>
|
|
3007
|
+
`,
|
|
3008
|
+
}]
|
|
3009
|
+
}] });
|
|
3010
|
+
|
|
3011
|
+
/**
|
|
3012
|
+
* Copyright 2025 Google LLC
|
|
3013
|
+
*
|
|
3014
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3015
|
+
* you may not use this file except in compliance with the License.
|
|
3016
|
+
* You may obtain a copy of the License at
|
|
3017
|
+
*
|
|
3018
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
3019
|
+
*
|
|
3020
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
3021
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
3022
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
3023
|
+
* See the License for the specific language governing permissions and
|
|
3024
|
+
* limitations under the License.
|
|
3025
|
+
*/
|
|
3026
|
+
class PhoneAuthScreenComponent {
|
|
3027
|
+
ui = injectUI();
|
|
3028
|
+
mfaResolver = computed(() => this.ui().multiFactorResolver, ...(ngDevMode ? [{ debugName: "mfaResolver" }] : []));
|
|
3029
|
+
titleText = injectTranslation("labels", "signIn");
|
|
3030
|
+
subtitleText = injectTranslation("prompts", "signInToAccount");
|
|
3031
|
+
resendDelay = input(30, ...(ngDevMode ? [{ debugName: "resendDelay" }] : []));
|
|
3032
|
+
signIn = output();
|
|
3033
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PhoneAuthScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3034
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: PhoneAuthScreenComponent, isStandalone: true, selector: "fui-phone-auth-screen", inputs: { resendDelay: { classPropertyName: "resendDelay", publicName: "resendDelay", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { signIn: "signIn" }, ngImport: i0, template: `
|
|
3035
|
+
<div class="fui-screen">
|
|
3036
|
+
<fui-card>
|
|
3037
|
+
<fui-card-header>
|
|
3038
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
3039
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
3040
|
+
</fui-card-header>
|
|
3041
|
+
<fui-card-content>
|
|
3042
|
+
@if (mfaResolver()) {
|
|
3043
|
+
<fui-multi-factor-auth-assertion-form />
|
|
3044
|
+
} @else {
|
|
3045
|
+
<fui-phone-auth-form (signIn)="signIn.emit($event)" />
|
|
3046
|
+
<fui-redirect-error />
|
|
3047
|
+
<ng-content />
|
|
3048
|
+
}
|
|
3049
|
+
</fui-card-content>
|
|
3050
|
+
</fui-card>
|
|
3051
|
+
</div>
|
|
3052
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CardComponent, selector: "fui-card" }, { kind: "component", type: CardHeaderComponent, selector: "fui-card-header" }, { kind: "component", type: CardTitleComponent, selector: "fui-card-title" }, { kind: "component", type: CardSubtitleComponent, selector: "fui-card-subtitle" }, { kind: "component", type: CardContentComponent, selector: "fui-card-content" }, { kind: "component", type: PhoneAuthFormComponent, selector: "fui-phone-auth-form", outputs: ["signIn"] }, { kind: "component", type: MultiFactorAuthAssertionFormComponent, selector: "fui-multi-factor-auth-assertion-form" }, { kind: "component", type: RedirectErrorComponent, selector: "fui-redirect-error" }] });
|
|
3053
|
+
}
|
|
3054
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: PhoneAuthScreenComponent, decorators: [{
|
|
3055
|
+
type: Component,
|
|
3056
|
+
args: [{
|
|
3057
|
+
selector: "fui-phone-auth-screen",
|
|
3058
|
+
standalone: true,
|
|
3059
|
+
imports: [
|
|
3060
|
+
CommonModule,
|
|
3061
|
+
CardComponent,
|
|
3062
|
+
CardHeaderComponent,
|
|
3063
|
+
CardTitleComponent,
|
|
3064
|
+
CardSubtitleComponent,
|
|
3065
|
+
CardContentComponent,
|
|
3066
|
+
PhoneAuthFormComponent,
|
|
3067
|
+
MultiFactorAuthAssertionFormComponent,
|
|
3068
|
+
RedirectErrorComponent,
|
|
3069
|
+
],
|
|
3070
|
+
template: `
|
|
3071
|
+
<div class="fui-screen">
|
|
3072
|
+
<fui-card>
|
|
3073
|
+
<fui-card-header>
|
|
3074
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
3075
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
3076
|
+
</fui-card-header>
|
|
3077
|
+
<fui-card-content>
|
|
3078
|
+
@if (mfaResolver()) {
|
|
3079
|
+
<fui-multi-factor-auth-assertion-form />
|
|
3080
|
+
} @else {
|
|
3081
|
+
<fui-phone-auth-form (signIn)="signIn.emit($event)" />
|
|
3082
|
+
<fui-redirect-error />
|
|
3083
|
+
<ng-content />
|
|
3084
|
+
}
|
|
3085
|
+
</fui-card-content>
|
|
3086
|
+
</fui-card>
|
|
3087
|
+
</div>
|
|
3088
|
+
`,
|
|
3089
|
+
}]
|
|
3090
|
+
}], propDecorators: { resendDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "resendDelay", required: false }] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
3091
|
+
|
|
3092
|
+
/**
|
|
3093
|
+
* Copyright 2025 Google LLC
|
|
3094
|
+
*
|
|
3095
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3096
|
+
* you may not use this file except in compliance with the License.
|
|
3097
|
+
* You may obtain a copy of the License at
|
|
3098
|
+
*
|
|
3099
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
3100
|
+
*
|
|
3101
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
3102
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
3103
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
3104
|
+
* See the License for the specific language governing permissions and
|
|
3105
|
+
* limitations under the License.
|
|
3106
|
+
*/
|
|
3107
|
+
class SignInAuthScreenComponent {
|
|
3108
|
+
ui = injectUI();
|
|
3109
|
+
mfaResolver = computed(() => this.ui().multiFactorResolver, ...(ngDevMode ? [{ debugName: "mfaResolver" }] : []));
|
|
3110
|
+
titleText = injectTranslation("labels", "signIn");
|
|
3111
|
+
subtitleText = injectTranslation("prompts", "signInToAccount");
|
|
3112
|
+
forgotPassword = output();
|
|
3113
|
+
signUp = output();
|
|
3114
|
+
signIn = output();
|
|
3115
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignInAuthScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3116
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: SignInAuthScreenComponent, isStandalone: true, selector: "fui-sign-in-auth-screen", outputs: { forgotPassword: "forgotPassword", signUp: "signUp", signIn: "signIn" }, ngImport: i0, template: `
|
|
3117
|
+
<div class="fui-screen">
|
|
3118
|
+
<fui-card>
|
|
3119
|
+
<fui-card-header>
|
|
3120
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
3121
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
3122
|
+
</fui-card-header>
|
|
3123
|
+
<fui-card-content>
|
|
3124
|
+
@if (mfaResolver()) {
|
|
3125
|
+
<fui-multi-factor-auth-assertion-form />
|
|
3126
|
+
} @else {
|
|
3127
|
+
<fui-sign-in-auth-form
|
|
3128
|
+
(forgotPassword)="forgotPassword.emit()"
|
|
3129
|
+
(signUp)="signUp.emit()"
|
|
3130
|
+
(signIn)="signIn.emit($event)"
|
|
3131
|
+
/>
|
|
3132
|
+
<fui-redirect-error />
|
|
3133
|
+
<ng-content />
|
|
3134
|
+
}
|
|
3135
|
+
</fui-card-content>
|
|
3136
|
+
</fui-card>
|
|
3137
|
+
</div>
|
|
3138
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CardComponent, selector: "fui-card" }, { kind: "component", type: CardHeaderComponent, selector: "fui-card-header" }, { kind: "component", type: CardTitleComponent, selector: "fui-card-title" }, { kind: "component", type: CardSubtitleComponent, selector: "fui-card-subtitle" }, { kind: "component", type: CardContentComponent, selector: "fui-card-content" }, { kind: "component", type: SignInAuthFormComponent, selector: "fui-sign-in-auth-form", outputs: ["forgotPassword", "signUp", "signIn"] }, { kind: "component", type: MultiFactorAuthAssertionFormComponent, selector: "fui-multi-factor-auth-assertion-form" }, { kind: "component", type: RedirectErrorComponent, selector: "fui-redirect-error" }] });
|
|
3139
|
+
}
|
|
3140
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignInAuthScreenComponent, decorators: [{
|
|
3141
|
+
type: Component,
|
|
3142
|
+
args: [{
|
|
3143
|
+
selector: "fui-sign-in-auth-screen",
|
|
3144
|
+
standalone: true,
|
|
3145
|
+
imports: [
|
|
3146
|
+
CommonModule,
|
|
3147
|
+
CardComponent,
|
|
3148
|
+
CardHeaderComponent,
|
|
3149
|
+
CardTitleComponent,
|
|
3150
|
+
CardSubtitleComponent,
|
|
3151
|
+
CardContentComponent,
|
|
3152
|
+
SignInAuthFormComponent,
|
|
3153
|
+
MultiFactorAuthAssertionFormComponent,
|
|
3154
|
+
RedirectErrorComponent,
|
|
3155
|
+
],
|
|
3156
|
+
template: `
|
|
3157
|
+
<div class="fui-screen">
|
|
3158
|
+
<fui-card>
|
|
3159
|
+
<fui-card-header>
|
|
3160
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
3161
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
3162
|
+
</fui-card-header>
|
|
3163
|
+
<fui-card-content>
|
|
3164
|
+
@if (mfaResolver()) {
|
|
3165
|
+
<fui-multi-factor-auth-assertion-form />
|
|
3166
|
+
} @else {
|
|
3167
|
+
<fui-sign-in-auth-form
|
|
3168
|
+
(forgotPassword)="forgotPassword.emit()"
|
|
3169
|
+
(signUp)="signUp.emit()"
|
|
3170
|
+
(signIn)="signIn.emit($event)"
|
|
3171
|
+
/>
|
|
3172
|
+
<fui-redirect-error />
|
|
3173
|
+
<ng-content />
|
|
3174
|
+
}
|
|
3175
|
+
</fui-card-content>
|
|
3176
|
+
</fui-card>
|
|
3177
|
+
</div>
|
|
3178
|
+
`,
|
|
3179
|
+
}]
|
|
3180
|
+
}], propDecorators: { forgotPassword: [{ type: i0.Output, args: ["forgotPassword"] }], signUp: [{ type: i0.Output, args: ["signUp"] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
3181
|
+
|
|
3182
|
+
/**
|
|
3183
|
+
* Copyright 2025 Google LLC
|
|
3184
|
+
*
|
|
3185
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3186
|
+
* you may not use this file except in compliance with the License.
|
|
3187
|
+
* You may obtain a copy of the License at
|
|
3188
|
+
*
|
|
3189
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
3190
|
+
*
|
|
3191
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
3192
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
3193
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
3194
|
+
* See the License for the specific language governing permissions and
|
|
3195
|
+
* limitations under the License.
|
|
3196
|
+
*/
|
|
3197
|
+
class SignUpAuthScreenComponent {
|
|
3198
|
+
ui = injectUI();
|
|
3199
|
+
mfaResolver = computed(() => this.ui().multiFactorResolver, ...(ngDevMode ? [{ debugName: "mfaResolver" }] : []));
|
|
3200
|
+
titleText = injectTranslation("labels", "signUp");
|
|
3201
|
+
subtitleText = injectTranslation("prompts", "enterDetailsToCreate");
|
|
3202
|
+
signUp = output();
|
|
3203
|
+
signIn = output();
|
|
3204
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignUpAuthScreenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3205
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.7", type: SignUpAuthScreenComponent, isStandalone: true, selector: "fui-sign-up-auth-screen", outputs: { signUp: "signUp", signIn: "signIn" }, ngImport: i0, template: `
|
|
3206
|
+
<div class="fui-screen">
|
|
3207
|
+
<fui-card>
|
|
3208
|
+
<fui-card-header>
|
|
3209
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
3210
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
3211
|
+
</fui-card-header>
|
|
3212
|
+
<fui-card-content>
|
|
3213
|
+
@if (mfaResolver()) {
|
|
3214
|
+
<fui-multi-factor-auth-assertion-form />
|
|
3215
|
+
} @else {
|
|
3216
|
+
<fui-sign-up-auth-form (signIn)="signIn.emit()" (signUp)="signUp.emit($event)" />
|
|
3217
|
+
<fui-redirect-error />
|
|
3218
|
+
<ng-content />
|
|
3219
|
+
}
|
|
3220
|
+
</fui-card-content>
|
|
3221
|
+
</fui-card>
|
|
3222
|
+
</div>
|
|
3223
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CardComponent, selector: "fui-card" }, { kind: "component", type: CardHeaderComponent, selector: "fui-card-header" }, { kind: "component", type: CardTitleComponent, selector: "fui-card-title" }, { kind: "component", type: CardSubtitleComponent, selector: "fui-card-subtitle" }, { kind: "component", type: CardContentComponent, selector: "fui-card-content" }, { kind: "component", type: SignUpAuthFormComponent, selector: "fui-sign-up-auth-form", outputs: ["signUp", "signIn"] }, { kind: "component", type: MultiFactorAuthAssertionFormComponent, selector: "fui-multi-factor-auth-assertion-form" }, { kind: "component", type: RedirectErrorComponent, selector: "fui-redirect-error" }] });
|
|
3224
|
+
}
|
|
3225
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.7", ngImport: i0, type: SignUpAuthScreenComponent, decorators: [{
|
|
3226
|
+
type: Component,
|
|
3227
|
+
args: [{
|
|
3228
|
+
selector: "fui-sign-up-auth-screen",
|
|
3229
|
+
standalone: true,
|
|
3230
|
+
imports: [
|
|
3231
|
+
CommonModule,
|
|
3232
|
+
CardComponent,
|
|
3233
|
+
CardHeaderComponent,
|
|
3234
|
+
CardTitleComponent,
|
|
3235
|
+
CardSubtitleComponent,
|
|
3236
|
+
CardContentComponent,
|
|
3237
|
+
SignUpAuthFormComponent,
|
|
3238
|
+
MultiFactorAuthAssertionFormComponent,
|
|
3239
|
+
RedirectErrorComponent,
|
|
3240
|
+
],
|
|
3241
|
+
template: `
|
|
3242
|
+
<div class="fui-screen">
|
|
3243
|
+
<fui-card>
|
|
3244
|
+
<fui-card-header>
|
|
3245
|
+
<fui-card-title>{{ titleText() }}</fui-card-title>
|
|
3246
|
+
<fui-card-subtitle>{{ subtitleText() }}</fui-card-subtitle>
|
|
3247
|
+
</fui-card-header>
|
|
3248
|
+
<fui-card-content>
|
|
3249
|
+
@if (mfaResolver()) {
|
|
3250
|
+
<fui-multi-factor-auth-assertion-form />
|
|
3251
|
+
} @else {
|
|
3252
|
+
<fui-sign-up-auth-form (signIn)="signIn.emit()" (signUp)="signUp.emit($event)" />
|
|
3253
|
+
<fui-redirect-error />
|
|
3254
|
+
<ng-content />
|
|
3255
|
+
}
|
|
3256
|
+
</fui-card-content>
|
|
3257
|
+
</fui-card>
|
|
3258
|
+
</div>
|
|
3259
|
+
`,
|
|
3260
|
+
}]
|
|
3261
|
+
}], propDecorators: { signUp: [{ type: i0.Output, args: ["signUp"] }], signIn: [{ type: i0.Output, args: ["signIn"] }] } });
|
|
3262
|
+
|
|
3263
|
+
/**
|
|
3264
|
+
* Copyright 2025 Google LLC
|
|
3265
|
+
*
|
|
3266
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3267
|
+
* you may not use this file except in compliance with the License.
|
|
3268
|
+
* You may obtain a copy of the License at
|
|
3269
|
+
*
|
|
3270
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
3271
|
+
*
|
|
3272
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
3273
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
3274
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
3275
|
+
* See the License for the specific language governing permissions and
|
|
3276
|
+
* limitations under the License.
|
|
3277
|
+
*/
|
|
3278
|
+
if (!isDevMode()) {
|
|
3279
|
+
const pkgJson = require("../package.json");
|
|
3280
|
+
registerFramework("angular", pkgJson.version);
|
|
3281
|
+
}
|
|
3282
|
+
|
|
3283
|
+
/**
|
|
3284
|
+
* Generated bundle index. Do not edit.
|
|
3285
|
+
*/
|
|
3286
|
+
|
|
3287
|
+
export { AppleSignInButtonComponent, ButtonComponent, CardComponent, ContentComponent, CountrySelectorComponent, DividerComponent, EmailLinkAuthFormComponent, EmailLinkAuthScreenComponent, FacebookSignInButtonComponent, ForgotPasswordAuthFormComponent, ForgotPasswordAuthScreenComponent, GithubSignInButtonComponent, GoogleSignInButtonComponent, MicrosoftSignInButtonComponent, MultiFactorAuthAssertionFormComponent, OAuthButtonComponent, OAuthScreenComponent, PhoneAuthFormComponent, PhoneAuthScreenComponent, PoliciesComponent, RedirectErrorComponent, SignInAuthFormComponent, SignInAuthScreenComponent, SignUpAuthFormComponent, SignUpAuthScreenComponent, SmsMultiFactorAssertionFormComponent, SmsMultiFactorAssertionPhoneFormComponent, SmsMultiFactorAssertionVerifyFormComponent, TotpMultiFactorAssertionFormComponent, TwitterSignInButtonComponent, injectCountries, injectDefaultCountry, injectEmailLinkAuthFormSchema, injectForgotPasswordAuthFormSchema, injectMultiFactorPhoneAuthNumberFormSchema, injectMultiFactorPhoneAuthVerifyFormSchema, injectMultiFactorTotpAuthNumberFormSchema, injectMultiFactorTotpAuthVerifyFormSchema, injectPhoneAuthFormSchema, injectPhoneAuthVerifyFormSchema, injectPolicies, injectRecaptchaVerifier, injectRedirectError, injectSignInAuthFormSchema, injectSignUpAuthFormSchema, injectTranslation, injectUI, provideFirebaseUI, provideFirebaseUIPolicies };
|
|
3288
|
+
//# sourceMappingURL=firebase-oss-ui-angular.mjs.map
|