--- title: "layouts" head.title: "layouts/" description: "Nuxt provides a layouts framework to extract common UI patterns into reusable layouts." navigation.icon: i-ph-folder-duotone --- ::callout{icon="i-ph-rocket-launch-duotone"} For best performance, components placed in this directory will be automatically loaded via asynchronous import when used. :: ## Enable Layouts Layouts are enabled by adding [``](/docs/api/components/nuxt-layout) to your [`app.vue`](/docs/guide/directory-structure/app): ```vue [app.vue] ``` To use a layout: - Set a `layout` property in your page with [definePageMeta](/docs/api/utils/define-page-meta). - Set the `name` prop of ``. ::callout{color="blue" icon="i-ph-info-duotone"} The layout name is normalized to kebab-case, so `someLayout` becomes `some-layout`. :: ::callout{color="blue" icon="i-ph-info-duotone"} If no layout is specified, `layouts/default.vue` will be used. :: ::callout{icon="i-ph-lightbulb-duotone"} If you only have a single layout in your application, we recommend using [`app.vue`](/docs/guide/directory-structure/app) instead. :: ::callout{color="amber" icon="i-ph-warning-duotone"} 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 ``. :: ## Default Layout Add a `~/layouts/default.vue`: ```vue [layouts/default.vue] ``` In a layout file, the content of the page will be displayed in the `` component. ## Named Layout ```bash [Directory Structure] -| layouts/ ---| default.vue ---| custom.vue ``` Then you can use the `custom` layout in your page: ```vue twoslash [pages/about.vue] ``` ::read-more{to="/docs/guide/directory-structure/pages#page-metadata"} Learn more about `definePageMeta`. :: You can directly override the default layout for all pages using the `name` property of [``](/docs/api/components/nuxt-layout): ```vue [app.vue] ``` 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: File | Layout Name -- | -- `~/layouts/desktop/DesktopDefault.vue` | `desktop-default` `~/layouts/desktop-base/DesktopBase.vue` | `desktop-base` `~/layouts/desktop/Desktop.vue` | `desktop` :link-example{to="/docs/examples/features/layouts"} ## Changing the Layout Dynamically You can also use the [`setPageLayout`](/docs/api/utils/set-page-layout) helper to change the layout dynamically: ```vue twoslash ``` :link-example{to="/docs/examples/features/layouts"} ## 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 `` component within the page. ::code-group ```vue [pages/index.vue] ``` ```vue [layouts/custom.vue] ``` :: ::callout If you use `` within your pages, make sure it is not the root element (or [disable layout/page transitions](/docs/getting-started/transitions#disable-transitions)). ::