The Structure Tool is the default content editing interface in Sanity Studio. Use the Structure Builder API to customize how your content is organized and displayed.
Define and configure a Structure Tool instance.
import {defineConfig} from 'sanity'
import {structureTool} from 'sanity/structure'
export default defineConfig({
// ...
plugins: [
structureTool()
]
})
Options
Tool identifier. Default: 'structure'
Tool display title. Default: 'Structure'
Tool icon component. Default: MasterDetailIcon
Function that returns the structure configuration
defaultDocumentNode
DefaultDocumentNodeResolver
Function that returns the default document pane configuration
Structure Builder
The Structure Builder API provides a fluent interface for configuring your Studio’s structure.
Basic Example
import {structureTool} from 'sanity/structure'
export default defineConfig({
plugins: [
structureTool({
structure: (S) =>
S.list()
.title('Content')
.items([
S.documentTypeListItem('article').title('Articles'),
S.documentTypeListItem('author').title('Authors'),
S.divider(),
S.listItem()
.title('Settings')
.child(
S.document()
.schemaType('siteSettings')
.documentId('siteSettings')
),
]),
}),
],
})
Structure Builder API
The Structure Builder (typically aliased as S) provides methods for building your structure.
S.list()
Create a list of items.
S.list()
.title('Content')
.items([
// List items
])
S.documentTypeListItem()
Create a list item for a document type.
S.documentTypeListItem('article')
.title('Articles')
.icon(DocumentIcon)
Override the display title
Custom child configuration
S.documentTypeList()
Create a list of documents of a specific type.
S.documentTypeList('article')
.title('Articles')
.filter('_type == $type && published == true')
.params({type: 'article'})
Parameters for the filter
S.listItem()
Create a custom list item.
S.listItem()
.title('Custom Item')
.icon(GearIcon)
.child(
S.document()
.schemaType('settings')
.documentId('siteSettings')
)
S.document()
Create a document pane.
S.document()
.schemaType('article')
.documentId('article-123')
.views([
S.view.form(),
S.view.component(Preview).title('Preview'),
])
S.divider()
Create a visual divider.
S.list()
.items([
S.documentTypeListItem('article'),
S.divider(),
S.documentTypeListItem('author'),
])
Document Views
Customize how documents are displayed.
The default form view.
S.view.component()
Custom component view.
import {Preview} from './components/Preview'
S.view.component(Preview)
.title('Preview')
.icon(EyeIcon)
React component to render
defaultDocumentNode
Configure default views for documents.
import {structureTool} from 'sanity/structure'
import {IframePreview} from './components/IframePreview'
export default defineConfig({
plugins: [
structureTool({
defaultDocumentNode: (S, {schemaType}) => {
// Add preview for specific types
if (schemaType === 'article') {
return S.document().views([
S.view.form(),
S.view.component(IframePreview).title('Preview'),
])
}
// Default for all other types
return S.document().views([S.view.form()])
},
}),
],
})
Structure Builder instance
Advanced Example
import {structureTool} from 'sanity/structure'
import {DocumentIcon, CogIcon, UsersIcon} from '@sanity/icons'
export default defineConfig({
plugins: [
structureTool({
structure: (S) =>
S.list()
.title('Content')
.items([
// Articles section
S.listItem()
.title('Articles')
.icon(DocumentIcon)
.child(
S.list()
.title('Articles')
.items([
S.listItem()
.title('Published')
.child(
S.documentList()
.title('Published Articles')
.filter('_type == "article" && published == true')
),
S.listItem()
.title('Drafts')
.child(
S.documentList()
.title('Draft Articles')
.filter('_type == "article" && published != true')
),
S.divider(),
S.listItem()
.title('All Articles')
.child(S.documentTypeList('article')),
])
),
// Authors
S.documentTypeListItem('author')
.title('Authors')
.icon(UsersIcon),
S.divider(),
// Singleton settings
S.listItem()
.title('Settings')
.icon(CogIcon)
.child(
S.document()
.schemaType('siteSettings')
.documentId('siteSettings')
.title('Site Settings')
),
]),
defaultDocumentNode: (S, {schemaType}) => {
if (schemaType === 'article') {
return S.document().views([
S.view.form(),
S.view.component(PreviewPane).title('Preview'),
])
}
return S.document().views([S.view.form()])
},
}),
],
})