Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
8c41477
feat(angular): Add injectors
Ehesp Sep 18, 2025
a9fe689
refactor(angular): Update sign-in-auth-form
Ehesp Sep 18, 2025
50e6890
refator(angular): Update forgot-password-auth-screen
Ehesp Sep 18, 2025
8547c42
refactor(angular): Update sign-in-auth-screen
Ehesp Sep 18, 2025
1ed20e2
refactor(angular): Update forgot-password-auth-form
Ehesp Sep 18, 2025
a5b2ca2
refactor(angular): Refactor fui-button
Ehesp Sep 18, 2025
85fd1bc
refactor(angular): Update card component
Ehesp Sep 18, 2025
f1b76cf
refactor(divider): Update divider component
Ehesp Sep 18, 2025
d7815f3
refactor(angular): Upgrade tanstack form
Ehesp Sep 18, 2025
57048c4
refactor(angular): updated email link auth screen
dackers86 Sep 19, 2025
b2cf40f
refactor(angular): Upgrade tanstack form
dackers86 Sep 22, 2025
8f33341
refactor(angular): Update sign-up-auth-{screen,form} components
Ehesp Sep 22, 2025
9c72f46
refactor(angular): Update fui-oauth-screen
Ehesp Sep 22, 2025
f8bc5c6
refactor(angular): email-link-auth-{screen,form}
Ehesp Sep 22, 2025
35c4c49
refactor(angular): Update forgot-password-auth-{screen,form}
Ehesp Sep 22, 2025
da11775
refactor(angular): forgot-password-{screen,form} updates
Ehesp Sep 23, 2025
3084b81
refactor(angular): oauth-button & google-sign-in-button component upd…
Ehesp Sep 23, 2025
1efd69e
refactor(angular): Migrate outputs to signals
Ehesp Sep 23, 2025
ee4c08c
fix(angular): Set default country
Ehesp Sep 23, 2025
00a3731
refactor(angular): Rework phone auth flows
Ehesp Sep 23, 2025
d68e549
refactor(angular): Align policies component
Ehesp Sep 23, 2025
ef25f6d
refactor(angular): Rework to contentChildren signal
Ehesp Sep 23, 2025
8a8a265
fix(angular): Fix build issues
Ehesp Sep 23, 2025
abcaa82
chore(angular): Align example with updates
Ehesp Sep 24, 2025
5faad00
fix(angular): Bump tanstack form version
Ehesp Sep 24, 2025
9cbd4e7
chore(angular): updated client and server routing
dackers86 Sep 24, 2025
6657b88
fix(angular): Subscribe to form state correctly
Ehesp Sep 25, 2025
5d3a9ac
fix(angular): Ensure fui-form-action is imported
Ehesp Sep 25, 2025
2a254de
fix(angular): Correctly bubble output events
Ehesp Sep 25, 2025
a8a0026
fix(angular): Correctly handle children rendering
Ehesp Sep 25, 2025
741e2ed
Merge branch '@invertase/align-core' of https://github.com/firebase/f…
Ehesp Sep 26, 2025
bbcad15
Merge branch '@invertase/align-core' of https://github.com/firebase/f…
Ehesp Sep 29, 2025
05f21a6
test(angular): Switch to testing-library angular + vitest
Ehesp Sep 29, 2025
12c959d
chore: Bump deps
Ehesp Oct 7, 2025
cd24445
Merge branch '@invertase/v7-development' of https://github.com/fireba…
Ehesp Oct 7, 2025
e18ab45
chore: Add eslint angular
Ehesp Oct 7, 2025
b2f5b13
refactor: Migrate to Jest (from Vitest)
Ehesp Oct 7, 2025
cae6a13
feat(angular): fui-divider
Ehesp Oct 9, 2025
42e60e5
feat(angular): Button component
Ehesp Oct 9, 2025
399ca50
feat(angular): fui-card
Ehesp Oct 9, 2025
ea08c3e
test(angular): Form tests
Ehesp Oct 9, 2025
b432c4b
chore(angular): Cleaup imports
Ehesp Oct 9, 2025
26e6d51
feat(angular): Policies tests
Ehesp Oct 9, 2025
aaf8e3d
fix(angular): Fix schema imports
Ehesp Oct 9, 2025
f5d2b93
Merge branch '@invertase/v7-development' of https://github.com/fireba…
Ehesp Oct 9, 2025
6f15008
feat(angular): Rework country selector on new spec
Ehesp Oct 9, 2025
5347b90
chore(angular): Cleanup
Ehesp Oct 9, 2025
791b424
feat(angular): Google sign in button
Ehesp Oct 9, 2025
8f6a0c8
feat(angular): Add component logo generation script
Ehesp Oct 9, 2025
df53799
feat(angular): Add facebook sign in button
Ehesp Oct 9, 2025
3b5ef52
feat(angular): Apple sign in button
Ehesp Oct 9, 2025
bf84f8e
feat(angular): Microsoft sign in button
Ehesp Oct 9, 2025
3216ef9
feat(angular): Twitter sign in button
Ehesp Oct 9, 2025
e5ffc01
feat(angular): GitHub sign in button
Ehesp Oct 9, 2025
330a6da
feat(angular): Add fui-content component
Ehesp Oct 9, 2025
2f4ece4
feat(angular): fui-sign-in-auth-screen component rework
Ehesp Oct 9, 2025
62872c8
feat(angular): fui-sign-up-auth-screen rework
Ehesp Oct 9, 2025
e32c62f
feat(angular): oauth-screen rework
Ehesp Oct 9, 2025
03b1098
test(angular): Update fui-forgot-password-screen tests to jest
Ehesp Oct 9, 2025
2958c0b
feat(angular): fui-email-link-auth-screen rework
Ehesp Oct 9, 2025
c63c438
feat(angular): fui-phone-auth-screen rework
Ehesp Oct 9, 2025
485b4a0
chore: Add readme
Ehesp Oct 9, 2025
57e270e
test(angular): Update forgot password form + test setup around ESM issue
Ehesp Oct 14, 2025
aabaa1a
test(angular): Update email link auth form tests
Ehesp Oct 14, 2025
9ee8fea
test(angular): Update sign in auth form tests
Ehesp Oct 14, 2025
63680bf
test(angular): Update sign up form tests
Ehesp Oct 14, 2025
9ef4e14
refactor(angular): Rework phone auth form
Ehesp Oct 14, 2025
6c269bb
chore(angular): Cleanup test files
Ehesp Oct 14, 2025
58e43fe
chore(angular): Cleanup
Ehesp Oct 14, 2025
15cd82a
chore(angular): Update example app
Ehesp Oct 14, 2025
605ba43
Merge branch '@invertase/v7-development' of https://github.com/fireba…
Ehesp Oct 14, 2025
7806c39
chore: Run formatting
Ehesp Oct 14, 2025
b7ce962
fix: Ensure angular tests run in CI
Ehesp Oct 14, 2025
80be7b5
Merge branch '@invertase/v7-development' of https://github.com/fireba…
Ehesp Oct 14, 2025
3a365fc
fix(angular): Remove invalid property
Ehesp Oct 14, 2025
23cd761
chore(angular): Add prepare step
Ehesp Oct 14, 2025
28d686d
test(angular): Rework Jest mocking setup
Ehesp Oct 14, 2025
8730abd
chore(angular): Formatting
Ehesp Oct 14, 2025
1a9410d
chore(angular): Apply formatting to logo generation
Ehesp Oct 14, 2025
a1585ff
Merge branch '@invertase/v7-development' into @invertase/align-update…
Ehesp Oct 15, 2025
3bca15d
chore(*): resolved conflicts
dackers86 Oct 17, 2025
5835f4f
fix(angular): updated angular example app to new firebase config types
dackers86 Oct 17, 2025
1d971ba
chore(*): removed api confiog from example apps
dackers86 Oct 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions eslint.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import tseslint from "typescript-eslint";
import pluginPrettier from "eslint-plugin-prettier";
import pluginReact from "eslint-plugin-react";
import pluginReactHooks from "eslint-plugin-react-hooks";
import pluginAngular from "angular-eslint";

const config: any[] = [
globalIgnores([
Expand Down Expand Up @@ -40,6 +41,11 @@ const config: any[] = [
],
},
},
{
// Angular package specific rules
files: ["packages/angular/src/**/*.{ts,tsx}"],
processor: pluginAngular.processInlineTemplates,
},
{
// React package specific rules
files: ["packages/react/src/**/*.{ts,tsx}"],
Expand Down
7 changes: 6 additions & 1 deletion examples/angular/src/app/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,12 @@ import { provideFirebaseUI, provideFirebaseUIPolicies } from "@firebase-ui/angul
import { initializeUI } from "@firebase-ui/core";

const firebaseConfig = {
// your Firebase config here
apiKey: "AIzaSyCvMftIUCD9lUQ3BzIrimfSfBbCUQYZf-I",
authDomain: "fir-ui-rework.firebaseapp.com",
projectId: "fir-ui-rework",
storageBucket: "fir-ui-rework.firebasestorage.app",
messagingSenderId: "200312857118",
appId: "1:200312857118:web:94e3f69b0e0a4a863f040f",
};

export const appConfig: ApplicationConfig = {
Expand Down
41 changes: 25 additions & 16 deletions examples/angular/src/app/app.routes.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,39 +22,48 @@ export const serverRoutes: ServerRoute[] = [
path: "",
renderMode: RenderMode.Prerender,
},
/** Key auth screen demos - good for SSG as they showcase Firebase UI components */
/** Static auth demos - good for SSG as they showcase Firebase UI components */
{
path: "screens/sign-in-auth-screen",
path: "sign-in",
renderMode: RenderMode.Prerender,
},
{
path: "screens/oauth-screen",
path: "oauth",
renderMode: RenderMode.Prerender,
},
/** Interactive auth routes - better as CSR for user interaction */
{
path: "screens/sign-up-auth-screen",
renderMode: RenderMode.Prerender,
path: "sign-up",
renderMode: RenderMode.Client,
},
{
path: "screens/email-link-auth-screen",
renderMode: RenderMode.Prerender,
path: "forgot-password",
renderMode: RenderMode.Client,
},
/** Dynamic auth routes - good for SSR as they may need server-side data */
{
path: "screens/phone-auth-screen",
renderMode: RenderMode.Prerender,
path: "email-link",
renderMode: RenderMode.Server,
},
/** Interactive auth routes - better as CSR for user interaction */
{
path: "sign-in",
renderMode: RenderMode.Client,
path: "email-link-oauth",
renderMode: RenderMode.Server,
},
{
path: "register",
renderMode: RenderMode.Client,
path: "phone",
renderMode: RenderMode.Server,
},
{
path: "forgot-password",
renderMode: RenderMode.Client,
path: "phone-oauth",
renderMode: RenderMode.Server,
},
{
path: "sign-in-oauth",
renderMode: RenderMode.Server,
},
{
path: "sign-up-oauth",
renderMode: RenderMode.Server,
},
/** All other routes will be rendered on the server (SSR) */
{
Expand Down
59 changes: 16 additions & 43 deletions examples/angular/src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,72 +21,45 @@ export const routes: Routes = [
path: "",
loadComponent: () => import("./home").then((m) => m.HomeComponent),
},
// Direct auth routes (matching NextJS paths)
{
path: "sign-in",
loadComponent: () => import("./auth/sign-in").then((m) => m.SignInComponent),
path: "email-link",
loadComponent: () => import("./auth/email-link").then((m) => m.EmailLinkComponent),
},
{
path: "register",
loadComponent: () => import("./auth/register").then((m) => m.RegisterComponent),
path: "email-link-oauth",
loadComponent: () => import("./auth/email-link-oauth").then((m) => m.EmailLinkOAuthComponent),
},
{
path: "forgot-password",
loadComponent: () => import("./auth/forgot-password").then((m) => m.ForgotPasswordComponent),
},
// Sign-in subdirectories
{
path: "sign-in/phone",
loadComponent: () => import("./auth/phone").then((m) => m.PhoneComponent),
path: "oauth",
loadComponent: () => import("./auth/oauth").then((m) => m.OAuthComponent),
},
{
path: "sign-in/email",
loadComponent: () => import("./auth/email-link").then((m) => m.EmailLinkComponent),
path: "phone",
loadComponent: () => import("./auth/phone").then((m) => m.PhoneComponent),
},
// Screen routes
{
path: "screens/sign-in-auth-screen",
loadComponent: () => import("./auth/sign-in-screen").then((m) => m.SignInScreenComponent),
path: "phone-oauth",
loadComponent: () => import("./auth/phone-oauth").then((m) => m.PhoneOAuthComponent),
},
{
path: "screens/sign-in-auth-screen-w-handlers",
loadComponent: () => import("./auth/sign-in-handlers").then((m) => m.SignInHandlersComponent),
path: "sign-in",
loadComponent: () => import("./auth/sign-in").then((m) => m.SignInComponent),
},
{
path: "screens/sign-in-auth-screen-w-oauth",
path: "sign-in-oauth",
loadComponent: () => import("./auth/sign-in-oauth").then((m) => m.SignInOAuthComponent),
},
{
path: "screens/email-link-auth-screen",
loadComponent: () => import("./auth/email-link-screen").then((m) => m.EmailLinkScreenComponent),
},
{
path: "screens/email-link-auth-screen-w-oauth",
loadComponent: () => import("./auth/email-link-oauth").then((m) => m.EmailLinkOAuthComponent),
},
{
path: "screens/phone-auth-screen",
loadComponent: () => import("./auth/phone-screen").then((m) => m.PhoneScreenComponent),
},
{
path: "screens/phone-auth-screen-w-oauth",
loadComponent: () => import("./auth/phone-oauth").then((m) => m.PhoneOAuthComponent),
},
{
path: "screens/sign-up-auth-screen",
path: "sign-up",
loadComponent: () => import("./auth/sign-up").then((m) => m.SignUpComponent),
},
{
path: "screens/sign-up-auth-screen-w-oauth",
loadComponent: () => import("./auth/register-oauth").then((m) => m.RegisterOAuthComponent),
},
{
path: "screens/oauth-screen",
loadComponent: () => import("./auth/oauth").then((m) => m.OAuthComponent),
},
{
path: "screens/password-reset-screen",
loadComponent: () => import("./auth/password-reset").then((m) => m.PasswordResetComponent),
path: "sign-up-oauth",
loadComponent: () => import("./auth/sign-up-oauth").then((m) => m.SignUpOAuthComponent),
},
{
path: "**",
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { EmailLinkAuthScreenComponent } from "@firebase-ui/angular";
selector: "app-email-link",
standalone: true,
imports: [CommonModule, RouterModule, EmailLinkAuthScreenComponent],
template: ` <fui-email-link-auth-screen></fui-email-link-auth-screen> `,
template: `<fui-email-link-auth-screen></fui-email-link-auth-screen> `,
styles: [],
})
export class EmailLinkComponent implements OnInit {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ import { Component, type OnInit, inject } from "@angular/core";
import { CommonModule } from "@angular/common";
import { Router, RouterModule } from "@angular/router";
import { Auth, type User, authState } from "@angular/fire/auth";
import { PasswordResetScreenComponent } from "@firebase-ui/angular";
import { ForgotPasswordAuthScreenComponent } from "@firebase-ui/angular";

@Component({
selector: "app-forgot-password",
standalone: true,
imports: [CommonModule, RouterModule, PasswordResetScreenComponent],
template: ` <fui-password-reset-screen signInRoute="/sign-in"></fui-password-reset-screen> `,
imports: [CommonModule, RouterModule, ForgotPasswordAuthScreenComponent],
template: `<fui-forgot-password-auth-screen (backToSignIn)="backToSignIn()"></fui-forgot-password-auth-screen> `,
styles: [],
})
export class ForgotPasswordComponent implements OnInit {
Expand All @@ -39,4 +39,8 @@ export class ForgotPasswordComponent implements OnInit {
}
});
}

backToSignIn() {
this.router.navigate(["/sign-in"]);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { PhoneAuthScreenComponent, GoogleSignInButtonComponent } from "@firebase
imports: [CommonModule, RouterModule, PhoneAuthScreenComponent, GoogleSignInButtonComponent],
template: `
<fui-phone-auth-screen>
<fui-google-sign-in-button></fui-google-sign-in-button>
<fui-google-sign-in-button />
</fui-phone-auth-screen>
`,
styles: [],
Expand Down
2 changes: 1 addition & 1 deletion examples/angular/src/app/auth/phone/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
* limitations under the License.
*/

export * from "./phone.component";
export * from "./phone-screen.component";
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ import { Auth, type User, authState } from "@angular/fire/auth";
import { PhoneAuthScreenComponent } from "@firebase-ui/angular";

@Component({
selector: "app-phone-screen",
selector: "app-phone",
standalone: true,
imports: [CommonModule, RouterModule, PhoneAuthScreenComponent],
template: ` <fui-phone-auth-screen [resendDelay]="2"></fui-phone-auth-screen> `,
template: ` <fui-phone-auth-screen></fui-phone-auth-screen>`,
styles: [],
})
export class PhoneScreenComponent implements OnInit {
export class PhoneComponent implements OnInit {
private auth = inject(Auth);
private router = inject(Router);

Expand Down
42 changes: 0 additions & 42 deletions examples/angular/src/app/auth/phone/phone.component.ts

This file was deleted.

Loading