@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.
@@ -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() }} &rarr;</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() }} &rarr;</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() }} &rarr;</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() }} &rarr;</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