mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-07 22:27:11 +02:00
* docs(v2): collapsible categories in sidebar * Update sidebar.md Co-authored-by: Yangshun Tay <tay.yang.shun@gmail.com>
244 lines
4.8 KiB
Markdown
244 lines
4.8 KiB
Markdown
---
|
||
id: sidebar
|
||
title: Sidebar
|
||
---
|
||
|
||
To generate a sidebar to your Docusaurus site, you need to define a file that exports a sidebar object and pass that into the `@docusaurus/plugin-docs` plugin directly or via `@docusaurus/preset-classic`.
|
||
|
||
```js {9-10}
|
||
// docusaurus.config.js
|
||
module.exports = {
|
||
// ...
|
||
presets: [
|
||
[
|
||
'@docusaurus/preset-classic',
|
||
{
|
||
docs: {
|
||
// Sidebars filepath relative to the site dir.
|
||
sidebarPath: require.resolve('./sidebars.js'),
|
||
},
|
||
...
|
||
},
|
||
],
|
||
],
|
||
};
|
||
```
|
||
|
||
## Sidebar object
|
||
|
||
A sidebar object is defined like this.
|
||
|
||
```typescript
|
||
type Sidebar = {
|
||
[sidebarId: string]:
|
||
| {
|
||
[sidebarCategory: string]: SidebarItem[];
|
||
}
|
||
| SidebarItem[];
|
||
};
|
||
```
|
||
|
||
Below is an example of a sidebar object. The key `docs` is the id of the sidebar (can be renamed to something else) and `Getting Started` is a category within the sidebar. `greeting` and `doc1` are both [sidebar item](#sidebar-item).
|
||
|
||
```js
|
||
// sidebars.js
|
||
module.exports = {
|
||
docs: {
|
||
'Getting started': ['greeting'],
|
||
Docusaurus: ['doc1'],
|
||
},
|
||
};
|
||
```
|
||
|
||
If you don't want to rely on iteration order of JavaScript object keys for the category name, the following sidebar object is also equivalent of the above.
|
||
|
||
```js
|
||
// sidebars.js
|
||
module.exports = {
|
||
docs: [
|
||
{
|
||
type: 'category',
|
||
label: 'Getting Started',
|
||
items: ['greeting'],
|
||
},
|
||
{
|
||
type: 'category',
|
||
label: 'Docusaurus',
|
||
items: ['doc1'],
|
||
},
|
||
],
|
||
};
|
||
```
|
||
|
||
You can also have multiple sidebars for different Markdown files by adding more top-level keys to the exported object.
|
||
|
||
Example:
|
||
|
||
```js
|
||
// sidebars.js
|
||
module.exports = {
|
||
firstSidebar: {
|
||
'Category A': ['doc1'],
|
||
},
|
||
secondSidebar: {
|
||
'Category A': ['doc2'],
|
||
'Category B': ['doc3'],
|
||
},
|
||
};
|
||
```
|
||
|
||
## Document ID
|
||
|
||
Every document has a unique `id`. By default, a document `id` is the name of the document (without the extension) relative to the root docs directory.
|
||
|
||
For example, `greeting.md` id is `greeting` and `guide/hello.md` id is `guide/hello`.
|
||
|
||
```bash
|
||
website # root directory of your site
|
||
└── docs
|
||
├── greeting.md
|
||
└── guide
|
||
└── hello.md
|
||
```
|
||
|
||
However, the last part of the `id` can be defined by user in the frontmatter. For example, if `guide/hello.md` content is defined as below, it's final `id` is `guide/part1`.
|
||
|
||
```yml
|
||
---
|
||
id: part1
|
||
---
|
||
Lorem ipsum
|
||
```
|
||
|
||
## Sidebar item
|
||
|
||
As the name implies, `SidebarItem` is an item defined in a Sidebar. There are a few types we support:
|
||
|
||
- [Doc](#doc)
|
||
- [Link](#link)
|
||
- [Ref](#ref)
|
||
- [Category](#category)
|
||
|
||
### Doc
|
||
|
||
```typescript
|
||
type SidebarItemDoc =
|
||
| string
|
||
| {
|
||
type: 'doc';
|
||
id: string;
|
||
};
|
||
```
|
||
|
||
Sidebar item type that links to a doc page. Example:
|
||
|
||
```js
|
||
{
|
||
type: 'doc',
|
||
id: 'doc1', // string - document id
|
||
}
|
||
```
|
||
|
||
Using just the [Document ID](#document-id) is perfectly valid as well, the following is equivalent to the above:
|
||
|
||
```js
|
||
'doc1'; // string - document id
|
||
```
|
||
|
||
Note that using this type will bind the linked doc to current sidebar, this means that if you access `doc1` page, the sidebar displayed will be the sidebar this item is on. For below case, `doc1` is bounded to `firstSidebar`.
|
||
|
||
```js
|
||
// sidebars.js
|
||
module.exports = {
|
||
firstSidebar: {
|
||
'Category A': ['doc1'],
|
||
},
|
||
secondSidebar: {
|
||
'Category A': ['doc2'],
|
||
'Category B': ['doc3'],
|
||
},
|
||
};
|
||
```
|
||
|
||
### Link
|
||
|
||
```typescript
|
||
type SidebarItemLink = {
|
||
type: 'link';
|
||
label: string;
|
||
href: string;
|
||
};
|
||
```
|
||
|
||
Sidebar item type that links to a non-document page. Example:
|
||
|
||
```js
|
||
{
|
||
type: 'link',
|
||
label: 'Custom Label', // string - the label that should be displayed.
|
||
href: 'https://example.com' // string - the target URL.
|
||
}
|
||
```
|
||
|
||
### Ref
|
||
|
||
```typescript
|
||
type SidebarItemRef = {
|
||
type: 'ref';
|
||
id: string;
|
||
};
|
||
```
|
||
|
||
Sidebar item type that links to doc without bounding it to the sidebar. Example:
|
||
|
||
```js
|
||
{
|
||
type: 'ref',
|
||
id: 'doc1', // string - document id
|
||
}
|
||
```
|
||
|
||
### Category
|
||
|
||
This is used to add hierarchies to the sidebar:
|
||
|
||
```typescript
|
||
type SidebarItemCategory = {
|
||
type: 'category';
|
||
label: string; // Sidebar label text.
|
||
items: SidebarItem[]; // Array of sidebar items.
|
||
};
|
||
```
|
||
|
||
As an example, here's how we created the subcategory for "Docs" under "Guides" in this site:
|
||
|
||
```js
|
||
// sidebars.js
|
||
module.exports = {
|
||
docs: {
|
||
Guides: [
|
||
'creating-pages',
|
||
{
|
||
type: 'category',
|
||
label: 'Docs',
|
||
items: ['markdown-features', 'sidebar'],
|
||
},
|
||
],
|
||
},
|
||
};
|
||
```
|
||
|
||
### Collapsible categories
|
||
|
||
For sites with a sizable amount of content, we support the option to expand/collapse a category to toggle the display of its contents. Categories are collapsible by default. If you want them to be always expanded, set `themeConfig.sidebarCollapsible` to `false`:
|
||
|
||
```js {5}
|
||
// docusaurus.config.js
|
||
module.exports = {
|
||
...
|
||
themeConfig: {
|
||
sidebarCollapsible: false,
|
||
...
|
||
},
|
||
}
|
||
```
|