diff --git a/public/placeholder.svg b/public/placeholder.svg
new file mode 100644
index 0000000..e763910
Binary files /dev/null and b/public/placeholder.svg differ
diff --git a/src/app/(marketing)/auth/error/page.tsx b/src/app/(marketing)/auth/error/page.tsx
new file mode 100644
index 0000000..314cf9d
--- /dev/null
+++ b/src/app/(marketing)/auth/error/page.tsx
@@ -0,0 +1,15 @@
+import { ErrorCard } from "@/components/auth/error-card";
+import { siteConfig } from "@/config/site";
+import { constructMetadata } from "@/lib/metadata";
+
+export const metadata = constructMetadata({
+ title: "Auth Error",
+ description: "Auth Error",
+ canonicalUrl: `${siteConfig.url}/auth/error`,
+});
+
+const AuthErrorPage = () => {
+ return ;
+};
+
+export default AuthErrorPage;
diff --git a/src/app/(marketing)/auth/layout.tsx b/src/app/(marketing)/auth/layout.tsx
new file mode 100644
index 0000000..7db59ab
--- /dev/null
+++ b/src/app/(marketing)/auth/layout.tsx
@@ -0,0 +1,37 @@
+import BackButtonSmall from "@/components/shared/back-button-small";
+import Image from "next/image";
+
+/**
+ * auth layout is different from other public layouts,
+ * so auth directory is not put in (public) directory.
+ *
+ * https://ui.shadcn.com/blocks#authentication-04
+ */
+export default function AuthLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+ {/* auth form */}
+
+
+ {/* brand image */}
+
+
+
+
+
+ );
+}
diff --git a/src/app/(marketing)/auth/loading.tsx b/src/app/(marketing)/auth/loading.tsx
new file mode 100644
index 0000000..d730bb7
--- /dev/null
+++ b/src/app/(marketing)/auth/loading.tsx
@@ -0,0 +1,5 @@
+import { Loader2Icon } from "lucide-react";
+
+export default function Loading() {
+ return ;
+}
diff --git a/src/app/(marketing)/auth/login/page.tsx b/src/app/(marketing)/auth/login/page.tsx
new file mode 100644
index 0000000..183c561
--- /dev/null
+++ b/src/app/(marketing)/auth/login/page.tsx
@@ -0,0 +1,15 @@
+import { LoginForm } from "@/components/auth/login-form";
+import { siteConfig } from "@/config/site";
+import { constructMetadata } from "@/lib/metadata";
+
+export const metadata = constructMetadata({
+ title: "Login",
+ description: "Login to your account",
+ canonicalUrl: `${siteConfig.url}/auth/login`,
+});
+
+const LoginPage = () => {
+ return ;
+};
+
+export default LoginPage;
diff --git a/src/app/(marketing)/auth/new-password/page.tsx b/src/app/(marketing)/auth/new-password/page.tsx
new file mode 100644
index 0000000..20e1744
--- /dev/null
+++ b/src/app/(marketing)/auth/new-password/page.tsx
@@ -0,0 +1,15 @@
+import { NewPasswordForm } from "@/components/auth/new-password-form";
+import { siteConfig } from "@/config/site";
+import { constructMetadata } from "@/lib/metadata";
+
+export const metadata = constructMetadata({
+ title: "New Password",
+ description: "Set a new password",
+ canonicalUrl: `${siteConfig.url}/auth/new-password`,
+});
+
+const NewPasswordPage = () => {
+ return ;
+};
+
+export default NewPasswordPage;
diff --git a/src/app/(marketing)/auth/new-verification/page.tsx b/src/app/(marketing)/auth/new-verification/page.tsx
new file mode 100644
index 0000000..92cb654
--- /dev/null
+++ b/src/app/(marketing)/auth/new-verification/page.tsx
@@ -0,0 +1,15 @@
+import { NewVerificationForm } from "@/components/auth/new-verification-form";
+import { siteConfig } from "@/config/site";
+import { constructMetadata } from "@/lib/metadata";
+
+export const metadata = constructMetadata({
+ title: "New Verification",
+ description: "New Verification",
+ canonicalUrl: `${siteConfig.url}/auth/new-verification`,
+});
+
+const NewVerificationPage = () => {
+ return ;
+};
+
+export default NewVerificationPage;
diff --git a/src/app/(marketing)/auth/register/page.tsx b/src/app/(marketing)/auth/register/page.tsx
new file mode 100644
index 0000000..6a5388c
--- /dev/null
+++ b/src/app/(marketing)/auth/register/page.tsx
@@ -0,0 +1,15 @@
+import { RegisterForm } from "@/components/auth/register-form";
+import { siteConfig } from "@/config/site";
+import { constructMetadata } from "@/lib/metadata";
+
+export const metadata = constructMetadata({
+ title: "Register",
+ description: "Create an account to get started",
+ canonicalUrl: `${siteConfig.url}/auth/register`,
+});
+
+const RegisterPage = () => {
+ return ;
+};
+
+export default RegisterPage;
diff --git a/src/app/(marketing)/auth/reset/page.tsx b/src/app/(marketing)/auth/reset/page.tsx
new file mode 100644
index 0000000..43b12a8
--- /dev/null
+++ b/src/app/(marketing)/auth/reset/page.tsx
@@ -0,0 +1,15 @@
+import { ResetForm } from "@/components/auth/reset-form";
+import { siteConfig } from "@/config/site";
+import { constructMetadata } from "@/lib/metadata";
+
+export const metadata = constructMetadata({
+ title: "Reset Password",
+ description: "Reset your password",
+ canonicalUrl: `${siteConfig.url}/auth/reset`,
+});
+
+const ResetPage = () => {
+ return ;
+};
+
+export default ResetPage;
diff --git a/src/app/(marketing)/page.tsx b/src/app/(marketing)/page.tsx
index 3eee014..78dfe60 100644
--- a/src/app/(marketing)/page.tsx
+++ b/src/app/(marketing)/page.tsx
@@ -6,7 +6,7 @@ export default function Home() {
+ {children}
+