Files
quartz-website/quartz/components/pages/404.tsx
T
2026-04-19 21:44:23 +02:00

57 lines
2.1 KiB
TypeScript

import { i18n } from "../../i18n"
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "../types"
const NotFound: QuartzComponent = ({ cfg }: QuartzComponentProps) => {
// If baseUrl contains a pathname after the domain, use this as the home link
const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`)
const baseDir = url.pathname
return (
<article class="popover-hint">
<h1>404</h1>
<p>{i18n(cfg.locale).pages.error.notFound}</p>
<a href={baseDir}>{i18n(cfg.locale).pages.error.home}</a>
<script
dangerouslySetInnerHTML={{
__html: `
if (typeof fetchData !== "undefined") {
fetchData.then(function(index) {
var base = document.querySelector("base");
var basePath = (base && base.getAttribute("href")) || "/";
if (basePath.length > 1 && basePath.endsWith("/")) {
basePath = basePath.slice(0, -1);
}
var pathname = window.location.pathname;
if (basePath.length > 1 && pathname.startsWith(basePath)) {
pathname = pathname.slice(basePath.length);
}
if (pathname.startsWith("/")) {
pathname = pathname.slice(1);
}
if (pathname.endsWith("/")) {
pathname = pathname.slice(0, -1);
}
// Strip .html extension if present
if (pathname.endsWith(".html")) {
pathname = pathname.slice(0, -5);
}
// Convert trailing /index to folder slug
if (pathname.endsWith("/index")) {
pathname = pathname.slice(0, -6);
}
var lowered = pathname.toLowerCase();
if (lowered !== pathname && index[lowered] != null) {
var target = basePath + (basePath.endsWith("/") ? "" : "/") + lowered;
window.location.replace(target);
}
});
}
`,
}}
/>
</article>
)
}
export default (() => NotFound) satisfies QuartzComponentConstructor