Fumadocs

Docs Page

A page in your documentation

Page is the base element of a documentation, it includes Table of contents, Footer, and Breadcrumb.

Install via Fumadocs CLI

For advanced customisation that supported options cannot suffice.

npx @fumadocs/cli@latest customise

Usage

Import it according to your layout.

page.tsx
import { DocsPage, DocsDescription, DocsTitle, DocsBody } from 'fumadocs-ui/layouts/docs/page';

<DocsPage>
  <DocsTitle>title</DocsTitle>
  <DocsDescription>description</DocsDescription>
  <DocsBody>
    <h2>This heading looks good!</h2>
    It applies the Typography styles, wrap your content here.
  </DocsBody>
</DocsPage>;

Good to know

Instead of rendering the title with DocsTitle in page.tsx, you can put the title into MDX file. This will render the title in the MDX body.

Edit on GitHub

Link to the original GitHub file with your component.

import { DocsPage } from 'fumadocs-ui/layouts/<layout>/page';

<DocsPage>
  <a
    href={`https://github.com/fuma-nama/fumadocs/blob/main/content/docs/${page.path}`}
    rel="noreferrer noopener"
    target="_blank"
    className="w-fit border rounded-xl p-2 font-medium text-sm text-fd-secondary-foreground bg-fd-secondary transition-colors hover:text-fd-accent-foreground hover:bg-fd-accent"
  >
    Edit on GitHub
  </a>
</DocsPage>;

Last Updated Time

Display last updated time of the page.

import { DocsPage, PageLastUpdate } from 'fumadocs-ui/layouts/<layout>/page';

const lastModifiedTime: Date | undefined;

<DocsPage>
  {/* Other content */}
  {lastModifiedTime && <PageLastUpdate date={lastModifiedTime} />}
</DocsPage>;

For lastModifiedTime, you can possibly use different version controls like Github or a CMS.

You can enable lastModified.

import { source } from '@/lib/source';
const page = source.getPage(['...']);

const lastModifiedTime = page.data.lastModified;

For Github hosted documents, you can use the getGithubLastEdit utility.

import { getGithubLastEdit } from 'fumadocs-core/content/github';

const lastModifiedTime = await getGithubLastEdit({
  owner: 'fuma-nama',
  repo: 'fumadocs',
  // file path in Git
  path: `content/docs/${page.path}`,
});

Configurations

Full Mode

To extend the page to fill up all available space, pass full to the page component. This will force TOC to be shown as a popover.

import { DocsPage } from 'fumadocs-ui/layouts/<layout>/page';

<DocsPage full>...</DocsPage>;

Table of Contents

An overview of all the headings in your article, it requires an array of headings.

For Markdown and MDX documents, You can obtain it using the TOC Utility. Content sources like Fumadocs MDX offer this out-of-the-box.

import { DocsPage } from 'fumadocs-ui/layouts/<layout>/page';

<DocsPage toc={headings}>...</DocsPage>;

You can customise or disable it with the TOC prop, or with TOCPopover on smaller devices.

import { DocsPage, type TOCMainProps } from 'fumadocs-ui/layouts/<layout>/page';

// pass options:
return (
  <DocsPage TOC={options} TOCPopover={options}>
    ...
  </DocsPage>
);

// or to replace renderer:
function TOC(props: TOCMainProps) {
  return <div />;
}

return <DocsPage TOC={TOC}>...</DocsPage>;

Prop

Type

Style

You can choose another style for TOC, like clerk inspired by https://clerk.com:

import { DocsPage } from 'fumadocs-ui/layouts/<layout>/page';

<DocsPage
  TOC={{
    style: 'clerk',
  }}
>
  ...
</DocsPage>;

You can also style the TOC title with the toc-title ID.

Footer is a navigation element that has two buttons to jump to the next and previous pages. When not specified, it shows the neighbour pages found from page tree.

Customise the footer with the Footer prop.

import { DocsPage } from 'fumadocs-ui/layouts/<layout>/page';

<DocsPage Footer={options}>...</DocsPage>;

Prop

Type

A navigation element, shown only when user is navigating in folders.

Prop

Type

How is this guide?

Last updated on

On this page