diff --git a/components/AuthUI/AuthUI.stories.tsx b/components/AuthUI/AuthUI.stories.tsx
new file mode 100644
index 00000000..e97c0864
--- /dev/null
+++ b/components/AuthUI/AuthUI.stories.tsx
@@ -0,0 +1,81 @@
+import { Meta, StoryObj } from "@storybook/nextjs-vite";
+import { HttpResponse, http } from "msw";
+import AuthUI from "@/components/AuthUI/AuthUI";
+import { User } from "@/src/api/generated";
+import { mockFirebaseUser, useFirebaseUser } from "@/src/hooks/useFirebaseUser.mock";
+import { CAPI } from "@/src/mocks/apibase";
+import { handlers } from "@/src/mocks/handlers";
+
+const meta = {
+ title: "Components/AuthUI/SignIn",
+ component: AuthUI,
+ parameters: {
+ layout: "fullscreen",
+ backgrounds: { default: "dark" },
+ msw: {
+ handlers: handlers,
+ },
+ },
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+} satisfies Meta;
+
+export default meta;
+
+type Story = StoryObj;
+
+// Mock user data
+const mockUser: User = {
+ id: "user-123",
+ name: "John Doe",
+ email: "john.doe@example.com",
+ isAdmin: false,
+ isApproved: true,
+};
+
+export const Default: Story = {
+ parameters: {
+ msw: {
+ handlers: [
+ http.get(CAPI("/users"), () => HttpResponse.json(null, { status: 401 })),
+ ...handlers,
+ ],
+ },
+ },
+ async beforeEach() {
+ // Mock Firebase user as logged out
+ useFirebaseUser.mockReturnValue([null, false, undefined]);
+ },
+};
+
+export const Loading: Story = {
+ parameters: {
+ msw: {
+ handlers: [
+ http.get(CAPI("/users"), () => HttpResponse.json(null, { status: 401 })),
+ ...handlers,
+ ],
+ },
+ },
+ async beforeEach() {
+ // Mock Firebase user as loading
+ useFirebaseUser.mockReturnValue([null, true, undefined]);
+ },
+};
+
+export const AlreadyLoggedIn: Story = {
+ parameters: {
+ msw: {
+ handlers: [http.get(CAPI("/users"), () => HttpResponse.json(mockUser)), ...handlers],
+ },
+ },
+ async beforeEach() {
+ // Mock Firebase user as logged in
+ useFirebaseUser.mockReturnValue([mockFirebaseUser, false, undefined]);
+ },
+};
diff --git a/components/AuthUI/Logout.stories.tsx b/components/AuthUI/Logout.stories.tsx
new file mode 100644
index 00000000..527db8b3
--- /dev/null
+++ b/components/AuthUI/Logout.stories.tsx
@@ -0,0 +1,66 @@
+import { Meta, StoryObj } from "@storybook/nextjs-vite";
+import { HttpResponse, http } from "msw";
+import Logout from "@/components/AuthUI/Logout";
+import { User } from "@/src/api/generated";
+import { mockFirebaseUser, useFirebaseUser } from "@/src/hooks/useFirebaseUser.mock";
+import { CAPI } from "@/src/mocks/apibase";
+import { handlers } from "@/src/mocks/handlers";
+
+const meta = {
+ title: "Components/AuthUI/Logout",
+ component: Logout,
+ parameters: {
+ layout: "fullscreen",
+ backgrounds: { default: "dark" },
+ msw: {
+ handlers: handlers,
+ },
+ },
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+} satisfies Meta;
+
+export default meta;
+
+type Story = StoryObj;
+
+// Mock user data
+const mockUser: User = {
+ id: "user-123",
+ name: "John Doe",
+ email: "john.doe@example.com",
+ isAdmin: false,
+ isApproved: true,
+};
+
+export const Default: Story = {
+ parameters: {
+ msw: {
+ handlers: [http.get(CAPI("/users"), () => HttpResponse.json(mockUser)), ...handlers],
+ },
+ },
+ async beforeEach() {
+ // Mock Firebase user as logged in
+ useFirebaseUser.mockReturnValue([mockFirebaseUser, false, undefined]);
+ },
+};
+
+export const LoggedOut: Story = {
+ parameters: {
+ msw: {
+ handlers: [
+ http.get(CAPI("/users"), () => HttpResponse.json(null, { status: 401 })),
+ ...handlers,
+ ],
+ },
+ },
+ async beforeEach() {
+ // Mock Firebase user as logged out
+ useFirebaseUser.mockReturnValue([null, false, undefined]);
+ },
+};