--- title: Nuxt & Sanity Integration Rules description: Integration guide for Nuxt, including @nuxtjs/sanity, visual editing, and data fetching. --- # Nuxt & Sanity Integration Rules ## 1. Setup & Configuration ### Configuration (`nuxt.config.ts`) Use the official `@nuxtjs/sanity` module. **Important:** Ensure the `minimal` client is NOT enabled if you want full features. ```typescript export default defineNuxtConfig({ modules: ["@nuxtjs/sanity"], sanity: { projectId: process.env.NUXT_SANITY_PROJECT_ID, dataset: process.env.NUXT_SANITY_DATASET, apiVersion: "2026-02-01", // Live Visual Editing Configuration visualEditing: { studioUrl: process.env.NUXT_SANITY_STUDIO_URL, token: process.env.NUXT_SANITY_API_READ_TOKEN, // Required for fetching drafts stega: true, // Enable stega for visual editing mode: 'live-visual-editing', // Default: enables live updates }, }, }); ``` ## 2. Data Fetching ### `useSanityQuery` Use the composable provided by the module for reactive fetching. It automatically handles preview state when configured. ```vue ``` ## 3. Visual Editing (Live Preview) ### Automatic Setup When `visualEditing` is configured in `nuxt.config.ts`, the module handles: 1. Injecting the Visual Editing overlays. 2. Refreshing data when content changes in the Studio. 3. Enabling Stega encoding. ### Handling Stega in Logic Just like Next.js, if you use stega-encoded strings in logic (e.g. `v-if="post.layout === 'full'"`), you must clean them. ```typescript import { stegaClean } from "@sanity/client/stega"; const layout = computed(() => stegaClean(props.layout)); ``` ## 4. Components ### Portable Text Use the `` component (if installed via `@portabletext/vue` or provided by the module). ```vue ``` ### Images Use `@sanity/image-url` helper or a dedicated image component. ```typescript import imageUrlBuilder from '@sanity/image-url' const builder = imageUrlBuilder(useSanity().client) // ... url generation logic ```