Skip to main content

Theme Config

Full reference for the themeConfig section of docusaurus.config.ts. These options control site metadata, navigation, footer, color mode, and content display.

Top-Level Structure

docusaurus.config.ts
ts
themeConfig: {
  site: { /* ... */ },
  colorMode: { /* ... */ },
  navbar: { /* ... */ },
  docs: { /* ... */ },
  blog: { /* ... */ },
  tableOfContents: { /* ... */ },
  announcementBar: { /* ... */ },
  backToTopButton: true,
  errorPages: { /* ... */ },
  footer: { /* ... */ },
},

Site

OptionTypeDefaultDescription
site.logoobject{}Logo configuration.
site.logo.altstring | undefinedundefinedLogo alt text.
site.logo.srcobject{}Logo icon image source paths (light/dark variants).
site.logo.src.lightstring | undefinedundefinedLight mode logo icon source path.
site.logo.src.darkstring | undefinedundefinedDark mode logo icon source path.
site.logo.hrefstring | undefinedundefinedLogo click URL.
site.logo.targetstring | undefinedundefinedLogo link target attribute (e.g. '_blank').
site.logo.relstring | undefinedundefinedLogo link rel attribute (e.g. 'noopener').
site.logo.ariaLabelstring | undefinedundefinedLogo link accessible label.
site.logo.wordmarkobject{}Wordmark image source paths (full logo with text).
site.logo.wordmark.lightstring | undefinedundefinedLight mode wordmark image source path.
site.logo.wordmark.darkstring | undefinedundefinedDark mode wordmark image source path.
site.imagestring''Default social/SEO image path.
site.metadataArray<{ name: string, content: string }>[]Additional meta tags.

Brand title

The navbar brand text is your site's top-level title (set in docusaurus.config.ts). For a custom brand that differs from the site title, supply a wordmark image (site.logo.wordmark) — it replaces the text.

Color Mode

OptionTypeDefaultDescription
colorMode.defaultMode'system' | 'light' | 'dark''system'Default color mode on first visit.
colorMode.disableSwitchbooleanfalseHide the color mode toggle. Setting defaultMode to 'system' already respects OS preference.
OptionTypeDefaultDescription
navbar.hideOnScrollbooleanfalseHide the navbar when scrolling down.
navbar.itemsNavbarItem[][]Navigation items. See below.

Each item in the navbar.items array follows this structure:

PropertyTypeDescription
labelstringDisplay text.
position'left' | 'right'Side of the navbar.
typestring | undefinedDocusaurus navbar item kind (see note). Omit for a plain link.
sidebarIdstring | undefinedSidebar ID when type is 'docSidebar'.
tostring | undefinedInternal URL when type is undefined.
hrefstring | undefinedExternal URL when type is undefined.
iconstring | undefinedIconify icon identifier (e.g., 'lucide:rocket').

The type field accepts any of Docusaurus's standard navbar item kinds — 'doc', 'docSidebar', 'dropdown', 'localeDropdown', 'docsVersion', 'docsVersionDropdown', 'html', and 'search' — and Nova renders them as standard Docusaurus navbar items — except localeDropdown, which Nova restyles with an abbreviated locale label. The sidebarId, to, and href columns above cover the common 'docSidebar' and plain-link cases; other kinds take their own fields per the Docusaurus navbar documentation.

Docs

OptionTypeDefaultDescription
docs.versionPersistencestring'localStorage'Where to persist the active version.
docs.sidebar.hideablebooleanfalseAllow users to collapse the sidebar.
docs.sidebar.autoCollapseCategoriesbooleanfalseAuto-collapse other categories when one is expanded.

Blog

OptionTypeDefaultDescription
blog.sidebar.groupByYearbooleantrueGroup blog posts by year in the sidebar.
blog.layout.headingstring'Blog'Blog listing page heading.
blog.layout.descriptionstring''Blog listing page description.
blog.share.platformsstring[][]Share button platforms. Accepts x, facebook, linkedin, reddit, copy.

Blog Header Rendering

blog.layout.heading and blog.layout.description populate the page-level header that <BlogLayout> renders above the blog content on the blog index page. Other built-in blog pages (archive, author) render their own headers instead, and swizzle consumers can pass <BlogLayout showHeader> to opt into the header on a custom page, or pass a header ReactNode prop to override the default heading + description entirely.

Table of Contents

OptionTypeDefaultDescription
tableOfContents.minHeadingLevelnumber2Minimum heading level to include in TOC.
tableOfContents.maxHeadingLevelnumber3Maximum heading level to include in TOC.

Announcement Bar

OptionTypeDefaultDescription
announcementBar.idstringUnique ID for dismiss persistence.
announcementBar.contentstringHTML content of the announcement.
announcementBar.backgroundColorstring | undefinedundefinedBackground color override.
announcementBar.textColorstring | undefinedundefinedText color override.
announcementBar.isCloseablebooleantrueWhether users can dismiss the bar.

Back to Top Button

OptionTypeDefaultDescription
backToTopButtonbooleantrueShow the back-to-top floating button.

Error Pages

Customize copy on the 404, route-error, and React error-boundary surfaces. Each sub-key is optional; omit a key to use the preset's built-in defaults. Each leaf value is also optional, so you can override just the fields you care about.

Not Found (/404)

OptionTypeDefaultDescription
errorPages.notFound.titlestringTitle shown above the 404 message.
errorPages.notFound.descriptionstringBody text below the title.
errorPages.notFound.backHomeLabelstringLabel of the back-home link.
errorPages.notFound.backHomeHrefstringHref of the back-home link. Defaults to the site root when omitted.

Error Page Content (route load errors)

OptionTypeDefaultDescription
errorPages.errorPageContent.titlestringTitle shown when a route-level error is caught.
errorPages.errorPageContent.retryLabelstringLabel of the retry button.

Error (React error boundary)

OptionTypeDefaultDescription
errorPages.error.retryLabelstringLabel of the retry button shown by the top-level error boundary.

Set to false to hide the footer entirely. Otherwise, provide an object:

OptionTypeDefaultDescription
footer.sectionsRecord<string, FooterLink[]>{}Named groups of footer links.
footer.layoutRecord<string, { title?, section }>{}Layout mapping for footer columns.
footer.socialLinksArray<{ icon: string, href: string, label: string }>[]Social media icon links.
footer.copyrightstring | undefinedundefinedCopyright text.
footer.creditbooleantrueShow "Built with Nova" credit.
footer.ctastring | { label, href } | undefinedundefinedCall-to-action. Pass a string for a static label, or { label, href } to make the entire block clickable.