fumadocs-ui/provider/waku package. Waku is a minimal React framework that focuses on simplicity and performance.
Installation
import type { ReactNode } from 'react';
import { Provider } from '@/components/provider';
import '@/styles/globals.css';
export default async function RootElement({ children }: { children: ReactNode }) {
return (
<html lang="en" suppressHydrationWarning>
<head></head>
<body data-version="1.0">
<Provider>{children}</Provider>
</body>
</html>
);
}
export const getConfig = async () => {
return {
render: 'static',
} as const;
};
'use client';
import type { ReactNode } from 'react';
import { RootProvider } from 'fumadocs-ui/provider/waku';
export function Provider({ children }: { children: ReactNode }) {
return <RootProvider>{children}</RootProvider>;
}
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
import { source } from '@/lib/source';
import { baseOptions } from '@/lib/layout.shared';
export default async function Layout({ children }: { children: React.ReactNode }) {
return (
<DocsLayout tree={source.getPageTree()} {...baseOptions()}>
{children}
</DocsLayout>
);
}
export const getConfig = async () => {
return {
render: 'static',
} as const;
};
import { source } from '@/lib/source';
import type { PageProps } from 'waku/router';
import defaultMdxComponents from 'fumadocs-ui/mdx';
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/layouts/docs/page';
export default function DocPage({ slugs }: PageProps<'/docs/[...slugs]'>) {
const page = source.getPage(slugs);
if (!page) {
return (
<div className="text-center py-12">
<h1 className="text-3xl font-bold mb-4">Page Not Found</h1>
<p className="text-gray-600 dark:text-gray-400">
The page you are looking for does not exist.
</p>
</div>
);
}
const MDX = page.data.body;
return (
<DocsPage toc={page.data.toc}>
<DocsTitle>{page.data.title}</DocsTitle>
<DocsDescription>{page.data.description}</DocsDescription>
<DocsBody>
<MDX components={{ ...defaultMdxComponents }} />
</DocsBody>
</DocsPage>
);
}
export async function getConfig() {
const pages = source
.generateParams()
.map((item) => (item.lang ? [item.lang, ...item.slug] : item.slug));
return {
render: 'static' as const,
staticPaths: pages,
} as const;
}
Framework Provider
TheWakuProvider integrates Fumadocs with Waku’s routing system:
useRouter().pathfor pathname trackingrouter.push()for navigationuseRouter().queryfor query parameters- Waku’s
Linkcomponent with prefetch support
Static Site Generation
Waku focuses on static site generation. Configure static paths:Client Components
Waku requires explicit client components. Mark interactive components with'use client':
src/components/provider.tsx
Page Props
Waku provides type-safe page props:Routing
Waku uses file-based routing:src/pages/index.tsx→/src/pages/docs/_layout.tsx→ Layout for/docs/*src/pages/docs/[...slugs].tsx→/docs/*(catch-all)