--- id: using-themes title: Themes --- Like plugins, themes are designed to add functionality to your Docusaurus site. As a good rule of thumb, themes are mostly focused on client-side, where plugins are more focused on server-side functionalities. Themes are also designed to be replace-able with other themes. ## Available themes {#available-themes} We maintain a [list of official themes](./api/themes/overview.md). ## Using themes {#using-themes} To use themes, specify the themes in your `docusaurus.config.js`. You may use multiple themes: ```js {3} title="docusaurus.config.js" module.exports = { // ... themes: ['@docusaurus/theme-classic', '@docusaurus/theme-live-codeblock'], }; ``` ## Theme components {#theme-components} Most of the time, theme is used to provide a set of React components, e.g. `Navbar`, `Layout`, `Footer`. Users can use these components in their code by importing them using the `@theme` webpack alias: ```js import Navbar from '@theme/Navbar'; ``` The alias `@theme` can refer to a few directories, in the following priority: 1. A user's `website/src/theme` directory, which is a special directory that has the higher precedence. 1. A Docusaurus theme packages's `theme` directory. 1. Fallback components provided by Docusaurus core (usually not needed). Given the following structure ``` website ├── node_modules │ └── docusaurus-theme │ └── theme │ └── Navbar.js └── src └── theme └── Navbar.js ``` `website/src/theme/Navbar.js` takes precedence whenever `@theme/Navbar` is imported. This behavior is called component swizzling. In iOS, method swizzling is the process of changing the implementation of an existing selector (method). In the context of a website, component swizzling means providing an alternative component that takes precedence over the component provided by the theme. **Themes are for providing UI components to present the content.** Most content plugins need to be paired with a theme in order to be actually useful. The UI is a separate layer from the data schema, so it makes it easy to swap out the themes for other designs (i.e., Bootstrap). For example, a Docusaurus blog consists of a blog plugin and a blog theme. ```js title="docusaurus.config.js" { theme: ['theme-blog'], plugins: ['plugin-content-blog'], } ``` And if you want to use Bootstrap styling, you can swap out the theme with `theme-blog-bootstrap` (fictitious non-existing theme): ```js title="docusaurus.config.js" { theme: ['theme-blog-bootstrap'], plugins: ['plugin-content-blog'], } ``` ## Wrapping your site with `` {#wrapper-your-site-with-root} A `` theme component is rendered at the very top of your Docusaurus site. It allows you to wrap your site with additional logic, by creating a file at `src/theme/Root.js`: ```js title="website/src/theme/Root.js" import React from 'react'; // Default implementation, that you can customize function Root({children}) { return <>{children}; } export default Root; ``` This component is applied above the router and the theme ``, and will **never unmount**. :::tip Use this component to render React Context providers and global stateful logic. ::: ## Swizzling theme components {#swizzling-theme-components} :::caution We discourage swizzling of components during the Docusaurus 2 beta phase. The theme components APIs are likely to evolve and have breaking changes. If possible, stick with the default appearance for now. ::: Docusaurus Themes' components are designed to be replaceable. To make it easier for you, we created a command for you to replace theme components called `swizzle`. To swizzle a component for a theme, run the following command in your doc site: ```bash npm2yarn npm run swizzle [component name] ``` As an example, to swizzle the `