Multiple S.list() groups in Sanity desk structure
Based on the Structure Builder documentation, you actually can have multiple lists with titles and groups of document types! The key is understanding that you only have one root S.list(), but within that list, you can create multiple S.listItem() entries that each contain their own nested lists.
Here's how to structure it:
export const structure: StructureResolver = (S) =>
S.list()
.id('root')
.title('Content')
.items([
// First section - "Site"
S.listItem()
.title('Site')
.child(
S.list()
.title('Site Settings')
.items([
S.documentTypeListItem('siteSettings'),
S.documentTypeListItem('navigation'),
S.documentTypeListItem('footer'),
])
),
// Divider (optional)
S.divider(),
// Second section - "Content"
S.listItem()
.title('Content')
.child(
S.list()
.title('Content Types')
.items([
S.documentTypeListItem('page'),
S.documentTypeListItem('post'),
S.documentTypeListItem('author'),
])
),
// Third section - "Media"
S.listItem()
.title('Media')
.child(
S.list()
.title('Media Assets')
.items([
S.documentTypeListItem('gallery'),
S.documentTypeListItem('video'),
])
),
])The pattern is:
- One root
S.list()at the top level - Multiple
S.listItem()entries within it (these become your titled sections) - Each
S.listItem()uses.child()to contain anotherS.list()with its own items
This creates a navigable structure where clicking on "Site", "Content", or "Media" in the root list takes you to a new list with that group's document types. According to the Structure Builder documentation, you can nest these infinitely deep if needed!
You can learn more about this in the Structure customization course.
Show original thread8 replies
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.