---
title: "Content model · Sanity × Nuxt UI"
description: "The document types, how URLs map to them, and why entries are generic."
canonical_url: "https://sanity-nuxtui.vercel.app/id/docs/content-model"
meta:
  "og:description": "The document types, how URLs map to them, and why entries are generic."
  "og:image": "https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Content%2Bmodel%2Cdescription_~VGhlIGRvY3VtZW50IHR5cGVzLCBob3cgVVJMcyBtYXAgdG8gdGhlbSwgYW5kIHdoeSBlbnRyaWVzIGFyZSBnZW5lcmljLg%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL2NvbnRlbnQtbW9kZWwi%2Cs_nPX5zriZyLpqg4Qe.png"
  "og:image:height": "630"
  "og:image:type": image/png
  "og:image:width": "1200"
  "og:title": "Content model · Sanity × Nuxt UI"
  "twitter:image": "https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Content%2Bmodel%2Cdescription_~VGhlIGRvY3VtZW50IHR5cGVzLCBob3cgVVJMcyBtYXAgdG8gdGhlbSwgYW5kIHdoeSBlbnRyaWVzIGFyZSBnZW5lcmljLg%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL2NvbnRlbnQtbW9kZWwi%2Cs_nPX5zriZyLpqg4Qe.png"
---

> Index of every page on this site: [llms.txt](https://sanity-nuxtui.vercel.app/llms.txt)

Halaman ini belum tersedia dalam bahasa Indonesia.

[Docs](https://sanity-nuxtui.vercel.app/id/docs)

# **Content model**

The document types, how URLs map to them, and why entries are generic.

| **Type** | **Studio menu** | **URL** | **Rendered by** |
| --- | --- | --- | --- |
| `page` | Pages | `/<slug>` | `PageBlocks.vue` |
| `collection` | Collections | `/<collection>` | `CollectionView.vue` → `EntryList.vue` |
| `entry` | Collections → \*name\* | `/<collection>/<entry>` | `EntryView.vue` |
| `author` | Authors | — | shown on entries |
| `settings` | Site Settings | every page | `app.vue` |

The page with the slug `home` is the homepage. Nested page slugs (`company/team`) work. A page and a collection cannot share a slug in the same language; the Studio validates it. When a page and an entry share a path, the page wins.

## Pages

A `page` has a title, a slug, a `blocks` array (the page builder, `objects/page-builder.ts`) and an `seo` object.

## Collections and entries

A `collection` describes a section of the site: its slug, list layout (`blog`, `cards`, `gallery`, `docs`), sort order, which optional entry fields its entries use, and display options (tag filter, table of contents, related entries).

An `entry` belongs to one collection through a reference. Every field except title, slug and collection is optional, so one type covers articles (`body`), galleries (`images`), case studies (`details`), designed pages (`blocks`) and docs (`body`, `group`, `order`).

The ****Fields on this entry**** setting (`sections`) is copied from the collection when an entry is created and hides the fields an entry does not use. `shared/entry-fields.ts` lists them.

**When a collection outgrows the generic entry**

, for example projects that need filtering by client, add a dedicated document type and a template for it, like any other Nuxt route.

## Links

The `link` object powers buttons, menus and footer links. It points either to a document (`page`, `collection` or `entry`) or to a URL, anchor, route or `mailto:`. The `LINK` projection in `queries.ts` resolves it to a `to` string, in the visitor's language when the target has a translation.

## Rich text

`blockContent` is Portable Text with headings (H2–H4), quotes, lists, bold, italic, code, underline, strike-through and links, plus these objects:

| **Type** | **Rendered as** |
| --- | --- |
| `image` | `AppImage` with an optional caption |
| `callout` | `UAlert` |
| `code` | `ProsePre` with Shiki highlighting, file icon and copy button |
| `codeGroup` | `ProseCodeGroup`, one tab per code block |
| `table` | Nuxt UI prose table; the first row is the header |

`PortableText.vue` renders it with `SanityContent` from `@nuxtjs/sanity`.

## Settings

`settings` is a singleton with the ID `settings`. With several languages, copies with the IDs `settings-<language>` hold translated fields; see [**Languages**](https://sanity-nuxtui.vercel.app/docs/languages).

[**Project structure** Where everything lives in the two apps.](https://sanity-nuxtui.vercel.app/id/docs/project-structure) [**Adding a block** Turn any Nuxt UI component into a block editors can use, in five steps.](https://sanity-nuxtui.vercel.app/id/docs/adding-a-block)

```json
{"@context":"https://schema.org","@graph":[{"@id":"https://sanity-nuxtui.vercel.app/#website","@type":"WebSite","name":"Sanity × Nuxt UI","url":"https://sanity-nuxtui.vercel.app/","publisher":{"@id":"https://sanity-nuxtui.vercel.app/#identity"}},{"@id":"https://sanity-nuxtui.vercel.app/id/docs/content-model#webpage","@type":"WebPage","dateModified":"2026-10-16T02:29:18Z","description":"The document types, how URLs map to them, and why entries are generic.","name":"Content model","url":"https://sanity-nuxtui.vercel.app/id/docs/content-model","isPartOf":{"@id":"https://sanity-nuxtui.vercel.app/#website"},"potentialAction":[{"@type":"ReadAction","target":["https://sanity-nuxtui.vercel.app/id/docs/content-model"]}]},{"@id":"https://sanity-nuxtui.vercel.app/#identity","@type":"Organization","name":"Sanity × Nuxt UI","url":"https://sanity-nuxtui.vercel.app"},{"@id":"https://sanity-nuxtui.vercel.app/id/docs/content-model#article","@type":"Article","dateModified":"2026-10-16T02:29:18Z","description":"The document types, how URLs map to them, and why entries are generic.","headline":"Content model","inLanguage":"en","thumbnailUrl":"https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Content%2Bmodel%2Cdescription_~VGhlIGRvY3VtZW50IHR5cGVzLCBob3cgVVJMcyBtYXAgdG8gdGhlbSwgYW5kIHdoeSBlbnRyaWVzIGFyZSBnZW5lcmljLg%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL2NvbnRlbnQtbW9kZWwi%2Cs_nPX5zriZyLpqg4Qe.png","author":{"@id":"https://sanity-nuxtui.vercel.app/#identity"},"image":{"@id":"https://sanity-nuxtui.vercel.app/#/schema/image/1"},"isPartOf":{"@id":"https://sanity-nuxtui.vercel.app/id/docs/content-model#webpage"},"mainEntityOfPage":{"@id":"https://sanity-nuxtui.vercel.app/id/docs/content-model#webpage"},"publisher":{"@id":"https://sanity-nuxtui.vercel.app/#identity"}},{"@id":"https://sanity-nuxtui.vercel.app/#/schema/image/1","@type":"ImageObject","contentUrl":"https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Content%2Bmodel%2Cdescription_~VGhlIGRvY3VtZW50IHR5cGVzLCBob3cgVVJMcyBtYXAgdG8gdGhlbSwgYW5kIHdoeSBlbnRyaWVzIGFyZSBnZW5lcmljLg%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL2NvbnRlbnQtbW9kZWwi%2Cs_nPX5zriZyLpqg4Qe.png","inLanguage":"en","url":"https://sanity-nuxtui.vercel.app/_og/d/c_Page%2Ctitle_Content%2Bmodel%2Cdescription_~VGhlIGRvY3VtZW50IHR5cGVzLCBob3cgVVJMcyBtYXAgdG8gdGhlbSwgYW5kIHdoeSBlbnRyaWVzIGFyZSBnZW5lcmljLg%2Cheadline_Docs%2CsiteName_~U2FuaXR5IMOXIE51eHQgVUk%2Cp_Ii9pZC9kb2NzL2NvbnRlbnQtbW9kZWwi%2Cs_nPX5zriZyLpqg4Qe.png"}]}
```

## Sitemap

See the full [sitemap](https://sanity-nuxtui.vercel.app/sitemap.md) for all pages.
