> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/nuxt/nuxt/llms.txt
> Use this file to discover all available pages before exploring further.

# layouts/

> Nuxt provides a layouts framework to extract common UI patterns into reusable layouts.

<Tip>
  For best performance, components placed in this directory will be automatically loaded via asynchronous import when used.
</Tip>

## Enable Layouts

Layouts are enabled by adding [`<NuxtLayout>`](/api/components/nuxt-layout) to your [`app.vue`](/directory-structure/app):

```vue app/app.vue theme={null}
<template>
  <NuxtLayout>
    <NuxtPage />
  </NuxtLayout>
</template>
```

To use a layout:

* Set a `layout` property in your page with `definePageMeta`.
* Set the `name` prop of `<NuxtLayout>`.
* Set the `appLayout` property in route rules.

<Note>
  The layout name is normalized to kebab-case, so `someLayout` becomes `some-layout`.
</Note>

<Note>
  If no layout is specified, `app/layouts/default.vue` will be used.
</Note>

<Info>
  If you only have a single layout in your application, we recommend using [`app.vue`](/directory-structure/app) instead.
</Info>

<Info>
  Unlike other components, your layouts must have a single root element to allow Nuxt to apply transitions between layout changes - and this root element cannot be a `<slot />`.
</Info>

## Default Layout

Add a `~/layouts/default.vue`:

```vue app/layouts/default.vue theme={null}
<template>
  <div>
    <p>Some default layout content shared across all pages</p>
    <slot />
  </div>
</template>
```

In a layout file, the content of the page will be displayed in the `<slot />` component.

## Named Layout

```bash theme={null}
layouts/
  default.vue
  custom.vue
```

Then you can use the `custom` layout in your page:

```vue pages/about.vue theme={null}
<script setup lang="ts">
definePageMeta({
  layout: 'custom',
})
</script>
```

You can directly override the default layout for all pages using the `name` property of [`<NuxtLayout>`](/api/components/nuxt-layout):

```vue app/app.vue theme={null}
<script setup lang="ts">
// You might choose this based on an API call or logged-in status
const layout = 'custom'
</script>

<template>
  <NuxtLayout :name="layout">
    <NuxtPage />
  </NuxtLayout>
</template>
```

If you have a layout in nested directories, the layout's name will be based on its own path directory and filename, with duplicate segments being removed.

| File                              | Layout Name       |
| --------------------------------- | ----------------- |
| `~/layouts/desktop/default.vue`   | `desktop-default` |
| `~/layouts/desktop-base/base.vue` | `desktop-base`    |
| `~/layouts/desktop/index.vue`     | `desktop`         |

For clarity, we recommend that the layout's filename matches its name.

## Changing the Layout Dynamically

You can also use the [`setPageLayout`](/api/utils/set-page-layout) helper to change the layout dynamically:

```vue theme={null}
<script setup lang="ts">
function enableCustomLayout () {
  setPageLayout('custom')
}
definePageMeta({
  layout: false,
})
</script>

<template>
  <div>
    <button @click="enableCustomLayout">
      Update layout
    </button>
  </div>
</template>
```

You can also set layouts for specific routes using the `appLayout` property in route rules:

```ts nuxt.config.ts theme={null}
export default defineNuxtConfig({
  routeRules: {
    // Set layout for specific route
    '/admin': { appLayout: 'admin' },
    // Set layout for multiple routes
    '/dashboard/**': { appLayout: 'dashboard' },
    // Disable layout for a route
    '/landing': { appLayout: false },
  },
})
```

<Tip>
  This is useful when you want to manage layouts centrally in your configuration rather than in each page file, or when you need to apply layouts to routes that don't have corresponding page components (such as catchall pages which might match many paths).
</Tip>

## Overriding a Layout on a Per-page Basis

If you are using pages, you can take full control by setting `layout: false` and then using the `<NuxtLayout>` component within the page.

<CodeGroup>
  ```vue app/pages/index.vue theme={null}
  <script setup lang="ts">
  definePageMeta({
    layout: false,
  })
  </script>

  <template>
    <div>
      <NuxtLayout name="custom">
        <template #header>
          Some header template content.
        </template>

        The rest of the page
      </NuxtLayout>
    </div>
  </template>
  ```

  ```vue app/layouts/custom.vue theme={null}
  <template>
    <div>
      <header>
        <slot name="header">
          Default header content
        </slot>
      </header>
      <main>
        <slot />
      </main>
    </div>
  </template>
  ```
</CodeGroup>

<Info>
  If you use `<NuxtLayout>` within your pages, make sure it is not the root element (or [disable layout/page transitions](/guide/transitions#disable-transitions)).
</Info>
