diff --git a/app/(pages)/error.tsx b/app/(pages)/error.tsx
new file mode 100644
index 0000000..3c69f4b
--- /dev/null
+++ b/app/(pages)/error.tsx
@@ -0,0 +1,60 @@
+"use client";
+
+import { IconAlertTriangle, IconRefresh } from "@tabler/icons-react";
+import Link from "next/link";
+import { useEffect } from "react";
+
+export default function PagesError({
+ error,
+ reset,
+}: {
+ error: Error & { digest?: string };
+ reset: () => void;
+}) {
+ useEffect(() => {
+ console.error("[pages error boundary]", error);
+ }, [error]);
+
+ return (
+
+ {/* Icon ring */}
+
+
+
+
+
+
+ Something went wrong
+
+
+ An unexpected error occurred while loading this page. You can try
+ again or head back to the dashboard.
+
+
+
+ {error.digest && (
+
+ Error ID: {error.digest}
+
+ )}
+
+
+
+
+ Dashboard
+
+
+
+ );
+}
diff --git a/app/(pages)/not-found.tsx b/app/(pages)/not-found.tsx
new file mode 100644
index 0000000..f0ee101
--- /dev/null
+++ b/app/(pages)/not-found.tsx
@@ -0,0 +1,44 @@
+import Link from "next/link";
+
+export default function PagesNotFound() {
+ return (
+
+ {/* Ghosted 404 */}
+
+ 404
+
+
+
+
+ Page not found
+
+
+ This page doesn't exist or may have been moved. Try searching for
+ what you're looking for instead.
+
+
+
+
+
+
Dashboard
+
+
+
+ Explore
+
+
+
+ );
+}
diff --git a/app/(pages)/people/[id]/not-found.tsx b/app/(pages)/people/[id]/not-found.tsx
index 9f1d8eb..b63b2f4 100644
--- a/app/(pages)/people/[id]/not-found.tsx
+++ b/app/(pages)/people/[id]/not-found.tsx
@@ -2,20 +2,45 @@ import Link from "next/link";
export default function PersonNotFound() {
return (
-
-
- Person not found
-
-
- The person you're looking for doesn't exist or may have been
- removed.
-
-
+
- Explore titles
-
+ 404
+
+
+
+
+ Person not found
+
+
+ The person you're looking for doesn't exist or may have been
+ removed from the database.
+
+
+
+
+
+
Explore titles
+
+
+
+ Dashboard
+
+
);
}
diff --git a/app/(pages)/titles/[id]/not-found.tsx b/app/(pages)/titles/[id]/not-found.tsx
index 3bebd5d..a08d902 100644
--- a/app/(pages)/titles/[id]/not-found.tsx
+++ b/app/(pages)/titles/[id]/not-found.tsx
@@ -2,18 +2,45 @@ import Link from "next/link";
export default function TitleNotFound() {
return (
-
-
Title not found
-
- The title you're looking for doesn't exist or may have been
- removed.
-
-
+
- Explore titles
-
+ 404
+
+
+
+
+ Title not found
+
+
+ The title you're looking for doesn't exist or may have been
+ removed from the database.
+
+
+
+
+
+
Explore titles
+
+
+
+ Dashboard
+
+
);
}
diff --git a/app/global-error.tsx b/app/global-error.tsx
new file mode 100644
index 0000000..c8c5182
--- /dev/null
+++ b/app/global-error.tsx
@@ -0,0 +1,161 @@
+"use client";
+
+export default function GlobalError({
+ error,
+ reset,
+}: {
+ error: Error & { digest?: string };
+ reset: () => void;
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
Intermission
+
+
+ We hit a snag loading this page. This is usually temporary —
+ try refreshing or come back in a moment.
+
+
+ {error.digest && (
+
Error ID: {error.digest}
+ )}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/not-found.tsx b/app/not-found.tsx
new file mode 100644
index 0000000..7b18e8b
--- /dev/null
+++ b/app/not-found.tsx
@@ -0,0 +1,74 @@
+import Link from "next/link";
+import { SofaLogo } from "@/components/sofa-logo";
+
+export default function NotFound() {
+ return (
+
+ {/* Warm projector glow */}
+
+
+ {/* Subtle vertical light beam */}
+
+
+
+ {/* Frame counter label */}
+
+ Scene not found
+
+
+ {/* Large ghosted 404 */}
+
+ 404
+
+
+ {/* Message */}
+
+
+ Lost in the credits
+
+
+ This page was left on the cutting room floor. It may have been
+ moved, removed, or never made it past the screenplay.
+
+
+
+ {/* Actions */}
+
+
+ {/* Logo watermark */}
+
+
+
+
+
+ );
+}