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 */} +
+ + Return home +
+ +
+ + {/* Logo watermark */} +
+ +
+
+
+ ); +}