This is a Sanity Studio v3 plugin.
npm install sanity-plugin-user-guide
Define your page structure for the user guide:
const userGuideStructure = defineUserGuide([
page().title('Home').markdown(home).icon(HomeIcon),
divider(),
page().title('ContactPage').markdown(contactPage).icon(CommentIcon).documentType('contactPage'),
multiPage().title('ContentPage').icon(DocumentIcon).pages([
page().title('Creating a content page').markdown(creatingAContentPage).documentType('contentPage'),
page().title('Content Blocks').markdown(contentBlocks),
page().title('Uploading media').markdown(uploadingMedia),
]),
]);
Add it as a plugin in sanity.config.ts
(or .js):
import {defineConfig} from 'sanity'
import {userGuidePlugin} from 'sanity-plugin-user-guide'
export default defineConfig({
//...
plugins: [userGuidePlugin({userGuideStructure})],
})
If you want to import markdown files from a typescript file, you can add the following snippet to your global.d.ts
.
declare module '*.md' {
const content: string;
export default content;
}
Then you can import the markdown file as a string:
import home from './home.md';
The plugin uses an API similar to Sanity's structure builder to define the user guide structure. Currently, the following methods are available:
A single page in the user guide. To describe the content of the page, you can use either markdown or a react component.
It is possible to link a page to document type(s) or id(s). This will add it to the user menu for those documents. Clicking the link will open the user guide in a side panel of the structure tool.
page().title('Home').markdown(home).icon(HomeIcon).documentType('home')
Methods | Description |
---|---|
title(title) | Sets the title of the page. Parameters: title: string |
slug(slug) | Sets the slug of the page. Uses the title by default. Parameters: slug: string |
markdown(markdown) | Sets the content of the page using markdown. Parameters: markdown: string |
component(component) | Sets the content of the page using a React component. Parameters: component: React.ElementType |
icon(icon) | Sets an Icon for this page in the page tree. Parameters: icon: React.ElementType |
documentType(documentType) | Selects one or multiple document types that link to this page. Parameters: documentType: string | string[] |
documentId(documentId) | Selects one or multiple document IDs that link to this page. Parameters: documentId: string | string[] |
A page that contains multiple subpages. This is useful for splitting up a large topic into multiple steps.
multiPage().title('ContentPage').icon(DocumentIcon).pages([
page().title('Creating a content page').markdown(creatingAContentPage).documentType(contentPage),
page().title('Content Blocks').markdown(contentBlocks),
page().title('Uploading media').markdown(uploadingMedia),
])
Methods | Description |
---|---|
title(title) | Sets the title of the page. Parameters: title: string |
slug(slug) | Sets the slug of the page. Uses the title by default. Parameters: slug: string |
pages(pages) | Set the pages to be displayed within this multi page. You can use the page method above to generate these pages. Parameters: pages: PageBuilder[] |
icon(icon) | Sets an Icon for this page in the page tree. Parameters: icon: React.ElementType |
A simple divider in the user guide tree to separate groups of pages. This has no additional methods.
divider()
MIT © Q42
This plugin uses @sanity/plugin-kit with default configuration for build & watch scripts.
See Testing a plugin in Sanity Studio on how to run this plugin with hotreload in the studio.