Files
Website/src/routes/+error.svelte
2025-12-01 06:55:28 +00:00

153 lines
4.8 KiB
Svelte

<script lang="ts">
import { page } from "$app/stores";
import TerminalTUI from "$lib/components/TerminalTUI.svelte";
import type { TerminalLine } from "$lib/components/tui/types";
import { user } from "$lib/config";
// Fun 404 messages
const notFoundMessages = [
"Looks like this page went on vacation... without telling anyone.",
"404: Page not found. It's probably hiding with the missing socks.",
"This page has mass, but it seems to have no class.",
"You've reached the edge of the internet. Turn back now.",
"The page you're looking for is in another castle.",
"Oops! This page took a wrong turn at /dev/null.",
"Error 404: Page went out for coffee and never came back.",
"This page was mass deleted from the matrix.",
"The server ate your page. Bad server!",
"Page not found. Have you tried turning it off and on again?",
"This URL is as empty as my coffee cup at 3am.",
"404: The page is a lie.",
"Segmentation fault (core dumped)... just kidding, it's a 404.",
"rm -rf /page... Oops, wrong command.",
"This page has been mass yeeted into the void.",
];
// Generic error messages
const errorMessages: Record<number, string[]> = {
500: [
"The server is having an existential crisis.",
"Something went wrong on our end. We're on it!",
"Internal Server Error: The hamsters powering the server need a break.",
],
503: [
"Service temporarily unavailable. Even servers need naps.",
"We're doing some maintenance. BRB!",
],
};
const status = $derived($page.status);
const errorMessage = $derived($page.error?.message || "Something went wrong");
const pathname = $derived($page.url.pathname);
// Pick a random fun message based on status
function getFunMessage(): string {
if (status === 404) {
return notFoundMessages[
Math.floor(Math.random() * notFoundMessages.length)
];
}
const msgs = errorMessages[status];
if (msgs) {
return msgs[Math.floor(Math.random() * msgs.length)];
}
return "Something unexpected happened. Our code monkeys are investigating.";
}
// ASCII art for different errors (use ███ block characters)
function getAsciiArt(): string[] {
// 404: Page Not Found (Pink)
if (status === 404) {
return [
"(&pink) █ █ ███ █ █ (&)",
"(&pink) █ █ █ █ █ █ (&)",
"(&pink) ████ █ █ ████ (&)",
"(&pink) █ █ █ █ (&)",
"(&pink) █ ███ █ (&)",
];
}
// 500: Server Error (Red/Error)
if (status >= 500) {
return [
"(&error) ███ ███ ███ (&)",
"(&error) █ █ █ █ █ (&)",
"(&error) ███ █ █ █ █ (&)",
"(&error) █ █ █ █ █ (&)",
"(&error) ███ ███ ███ (&)",
];
}
// Generic ERROR (Pink)
return [
"(&pink) ███ ███ ███ ███ ███ (&)",
"(&pink) █ █ █ █ █ █ █ █ █ (&)",
"(&pink) ███ ███ ███ █ █ ███ (&)",
"(&pink) █ █ █ █ █ █ █ █ █ (&)",
"(&pink) ███ █ █ █ █ ███ █ █ (&)",
];
}
const funMessage = $derived(getFunMessage());
const asciiLines = $derived(getAsciiArt());
// Build the terminal lines for the error page (derived to capture reactive values)
const lines = $derived<TerminalLine[]>([
// Command that caused the error
{ type: "command", content: `curl ${pathname}` },
{ type: "blank", content: "" },
// ASCII art
...asciiLines.map((line: string) => ({ type: "output" as const, content: line })),
{ type: "blank", content: "" },
// Error status (styled with leading X like the screenshot)
{
type: "error",
content: `(&error,bold)X Error ${status}: ${errorMessage}(&)`,
},
{ type: "output", content: `(&muted,italic)# ${funMessage}(&)` },
{ type: "divider", content: "SUGGESTIONS" },
// Suggestions
{ type: "command", content: "cat suggestions.txt" },
{ type: "info", content: "Check if the URL is correct" },
{ type: "info", content: "Try refreshing the page" },
{ type: "info", content: "Contact me if the problem persists" },
{ type: "divider", content: "ACTIONS" },
// Navigation buttons
{
type: "button",
content: "Go Home",
icon: "mdi:home",
style: "primary",
href: "/",
},
{
type: "button",
content: "Go Back",
icon: "mdi:arrow-left",
style: "accent",
action: () => history.back(),
},
{ type: "blank", content: "" },
]);
</script>
<svelte:head>
<title>{status} | {user.username}</title>
<meta name="description" content="Error {status} - {errorMessage}" />
</svelte:head>
<div class="error-container">
<TerminalTUI {lines} title="error" interactive={true} speed="instant" />
</div>
<style>
.error-container {
padding: 2rem 1rem;
min-height: calc(100vh - 60px);
}
</style>