diff --git a/web/frontend/app/features/auth/components/AuthCardHeading.tsx b/web/frontend/app/features/auth/components/AuthCardHeading.tsx
new file mode 100644
index 00000000..7cc1ba7d
--- /dev/null
+++ b/web/frontend/app/features/auth/components/AuthCardHeading.tsx
@@ -0,0 +1,13 @@
+interface AuthCardHeadingProps {
+ title: string;
+ subtitle: string;
+}
+
+const AuthCardHeading = ({ title, subtitle }: AuthCardHeadingProps) => (
+
+);
+
+export default AuthCardHeading;
diff --git a/web/frontend/app/features/auth/components/AuthErrorAlert.tsx b/web/frontend/app/features/auth/components/AuthErrorAlert.tsx
new file mode 100644
index 00000000..4892d919
--- /dev/null
+++ b/web/frontend/app/features/auth/components/AuthErrorAlert.tsx
@@ -0,0 +1,11 @@
+interface AuthErrorAlertProps {
+ message: string;
+}
+
+const AuthErrorAlert = ({ message }: AuthErrorAlertProps) => (
+
+ {message}
+
+);
+
+export default AuthErrorAlert;
diff --git a/web/frontend/app/features/auth/components/AuthSplitLayout.tsx b/web/frontend/app/features/auth/components/AuthSplitLayout.tsx
new file mode 100644
index 00000000..0e770da3
--- /dev/null
+++ b/web/frontend/app/features/auth/components/AuthSplitLayout.tsx
@@ -0,0 +1,39 @@
+import barBackground from '../../../assets/bar-background.jpg';
+
+interface AuthSplitLayoutProps {
+ headline: string;
+ blurb: string;
+ children: React.ReactNode;
+}
+
+const AuthSplitLayout = ({ headline, blurb, children }: AuthSplitLayoutProps) => (
+
+
+
+ {/* Darkens the photo from the bottom up so the white hero text stays legible */}
+
+
+
+
+
+ {headline}
+
+
+
+ {blurb}
+
+
+
+
+
+ {children}
+
+
+
+
+);
+
+export default AuthSplitLayout;
diff --git a/web/frontend/app/features/auth/components/AuthSwitchPrompt.tsx b/web/frontend/app/features/auth/components/AuthSwitchPrompt.tsx
new file mode 100644
index 00000000..953960e1
--- /dev/null
+++ b/web/frontend/app/features/auth/components/AuthSwitchPrompt.tsx
@@ -0,0 +1,18 @@
+import { Link } from 'react-router';
+
+interface AuthSwitchPromptProps {
+ lead: string;
+ to: string;
+ label: string;
+}
+
+const AuthSwitchPrompt = ({ lead, to, label }: AuthSwitchPromptProps) => (
+
+ {lead}{' '}
+
+ {label}
+
+
+);
+
+export default AuthSwitchPrompt;
diff --git a/web/frontend/app/features/auth/components/ShowPasswordToggle.tsx b/web/frontend/app/features/auth/components/ShowPasswordToggle.tsx
new file mode 100644
index 00000000..c61c9e14
--- /dev/null
+++ b/web/frontend/app/features/auth/components/ShowPasswordToggle.tsx
@@ -0,0 +1,18 @@
+import { Button } from '@headlessui/react';
+
+interface ShowPasswordToggleProps {
+ shown: boolean;
+ onToggle: () => void;
+}
+
+const ShowPasswordToggle = ({ shown, onToggle }: ShowPasswordToggleProps) => (
+
+);
+
+export default ShowPasswordToggle;