import type { Route } from "./+types/page"; import { DocsLayout } from "fumadocs-ui/layouts/docs"; import { DocsBody, DocsDescription, DocsPage, DocsTitle, MarkdownCopyButton, ViewOptionsPopover, } from "fumadocs-ui/layouts/docs/page"; import { getPageMarkdownUrl, source } from "@/lib/source"; import browserCollections from "collections/browser"; import { baseOptions } from "@/lib/layout.shared"; import { useFumadocsLoader } from "fumadocs-core/source/client"; import { useMDXComponents } from "@/components/mdx"; export async function loader({ params }: Route.LoaderArgs) { const slugs = params["*"].split("/").filter((v) => v.length > 0); const page = source.getPage(slugs); if (!page) throw new Response("Not found", { status: 404 }); return { path: page.path, markdownUrl: getPageMarkdownUrl(page).url, pageTree: await source.serializePageTree(source.getPageTree()), }; } const clientLoader = browserCollections.docs.createClientLoader({ component( { toc, frontmatter, default: Mdx }, // you can define props for the component { markdownUrl, path, }: { markdownUrl: string; path: string; }, ) { return ( {frontmatter.title} {frontmatter.title} {frontmatter.description}
); }, }); export default function Page({ loaderData }: Route.ComponentProps) { const { pageTree, path, markdownUrl } = useFumadocsLoader(loaderData); return ( {clientLoader.useContent(loaderData.path, { markdownUrl, path, })} ); }